【java基礎(chǔ)】Lambda表達(dá)式
Lambda表達(dá)式介紹
Java支持Lambda 表達(dá)式始于Java 8,它的出現(xiàn)簡(jiǎn)化了函數(shù)式接口匿名內(nèi)部類的語(yǔ)法。使用Lambda表達(dá)式可以讓我們的代碼更少,看上去更簡(jiǎn)潔,代碼更加靈活。但也有它的缺點(diǎn)所在,如果Lambda表達(dá)式用的不好的話,調(diào)試運(yùn)行和后期維護(hù)比較麻煩。
Lambda只能接受函數(shù)式接口,所謂的函數(shù)式接口指的是只能有一個(gè)抽象方法的接口。
Lambda表達(dá)式語(yǔ)法
Lambda表達(dá)式通過(guò)操作符->分為兩個(gè)部分:
? 左側(cè):指定了Lambda表達(dá)式所需要的所有參數(shù)。
? 右側(cè):指定了Lambda體,即Lambda表達(dá)式所要執(zhí)行的功能。
Lambda表達(dá)式的基本語(yǔ)法結(jié)構(gòu)如下,當(dāng)然,這里只是簡(jiǎn)單的Lambda 表達(dá)式的應(yīng)用。

到目前為止,我們對(duì)Lambda表達(dá)式有了基本的認(rèn)識(shí),下面用幾個(gè)簡(jiǎn)單的例子來(lái)讓我們好好理解一下Lambda表達(dá)式的使用,看看Lambda是怎樣簡(jiǎn)化了函數(shù)式接口匿名內(nèi)部類的。
public class LambdaExample {
public static void main(String[] args) {
//普通寫法(匿名內(nèi)部類)
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Ordinary Writing");
}
});
thread.start();
//Lambda寫法。無(wú)參無(wú)返回void
Thread thread1 = new Thread(() -> System.out.println("Lambda Writing"));
thread1.start();
}
}
******************【運(yùn)行結(jié)果】******************
Ordinary Writing
Lambda Writing函數(shù)式接口
前面講了使用Lambda表達(dá)式的前提是函數(shù)式接口,所以接下來(lái)學(xué)習(xí)一下函數(shù)式接口。
函數(shù)式接口介紹
函數(shù)式接口的定義:只允許有一個(gè)抽象方法的接口,那么它就是一個(gè)函數(shù)式接口。針對(duì)函數(shù)式接口,官方給我們提供了一個(gè)注解@FunctionalInterface,該注解會(huì)檢查它是否是一個(gè)函數(shù)式接口,所以如果我們需要自定義一個(gè)函數(shù)式接口的話,可以在接口類的上方聲明@FunctionalInterface。
需要注意的是,數(shù)式接口雖然規(guī)定只能有一個(gè)抽象方法,但是同時(shí)可以有多個(gè)非抽象方法(如靜態(tài)方法,默認(rèn)方法,私有方法)。下面是一個(gè)自定義的函數(shù)式接口:
@FunctionalInterface
public interface FunctionalInterface {
/**
* 抽象方法(只能有一個(gè))
*/
void method();
//void method1();再定義一個(gè)會(huì)提示:找到多個(gè)抽象方法
/**
* 默認(rèn)方法,必須用default修飾
*/
default void defaultMethod() {
System.out.println("默認(rèn)方法...");
}
/**
* 靜態(tài)方法方法
*/
static void staticMethod() {
System.out.println("靜態(tài)方法...");
}
}四大類型接口
Java8中增加了一個(gè)包:java.util.function。它們里面包含了常用的函數(shù)式接口,該包下定義的函數(shù)式接口非常多,主要有四大類:

可以看出四種函數(shù)式接口抽象方法的特點(diǎn)如下:
? 消費(fèi)型接口:有參數(shù)傳入,無(wú)結(jié)果返回。
? 供給型接口:無(wú)參數(shù)傳入,但是有返回值
? 判斷型接口:有參傳入,但是返回值類型是boolean結(jié)果。
? 功能型接口:既有參數(shù)傳入又有結(jié)果值返回
四種函數(shù)式接口的用法簡(jiǎn)單舉例如下:
/**
* 內(nèi)置最常用的四種函數(shù)式接口
*/
class FunctionalnterfaceTest{
//消費(fèi)型接口
public void test0(){
Consumer<String> consumer = s -> System.out.println("[Consumer<T>]--->" + s);
consumer.accept("hello");
}
//供給型接口
public void test1() {
Supplier<String> supplier = () -> "hello";
System.out.println("[Supplier<T>]--->" + supplier.get());
}
//判斷型接口
public void test2() {
Predicate<String> predicate = s -> s.equals("hello");
System.out.println("[Predicate<T>]--->" + predicate.test("hello"));
}
//功能性接口
public void test3() {
Function<String, String> function = (s) -> {
return "hello" + s;
};
System.out.println("[Function<T, R>]--->" + function.apply("666"));
}
}
public class FunctionalnterfaceExample {
public static void main(String[] args) {
FunctionalnterfaceTest functionalnterfaceTest = new FunctionalnterfaceTest();
functionalnterfaceTest.test0();
functionalnterfaceTest.test1();
functionalnterfaceTest.test2();
functionalnterfaceTest.test3();
}
}
******************【運(yùn)行結(jié)果】******************
[Consumer<T>]--->hello
[Supplier<T>]--->hello
[Predicate<T>]--->true
[Function<T, R>]--->hello666其實(shí),這四種函數(shù)式接口每種都有其變種形式,如消費(fèi)型接口有如下幾種形式:

不過(guò)盡管形式很多,但是用法其實(shí)和最基本的用法差不多,這里就不一一介紹了。
本文源碼地址:
https://github.com/qinlizhong1/javaStudy/tree/master/javaExample/src/main/java/java8
本文示例代碼環(huán)境:
操作系統(tǒng):macOs 12.1
JDK版本:12.0.1
maven版本: 3.8.4
??掃描上方二維碼關(guān)注
