Lambda表達式簡介
Lambda表達式是JAVA 1.8才開始有的重要功能,使用Lambda表達式可以替代匿名內部類,代碼簡潔易懂,提升工作效率。上代碼:

使用內部類和使用lambda實現代碼量對比
函數式接口簡介
有且只有一個抽象方法(可以包含default或static方法,但Object類除外)的接口是函數式接口。@FunctionlInterface就是用來指定某個接口必須是函數式接口。@FunctionalInterface不是必須的,只是告訴編譯器檢查這個接口,保證該接口只能包含一個抽象方法,否則就會編譯出錯。@FunctionalInterface主要是幫助程序員避免一些低級錯誤,比如多個抽象方法。
Java8 之前的函數式接口
java.util.Comparator //排序接口
java.lang.Runnable //線程無返回值接口
java.util.concurrent.Callable<V> //線程有返回值接口
java.lang.reflect.InvocationHandler //動態代理接口
等等......
常用的函數式接口
Java1.8函數式接口都在rt.jar的java.util.function包中,以下是經常用到的函數式接口(一定要熟記,其他的函數式接口都是在這些函數式接口上的擴展
):
名稱 |
唯一抽象方法 |
備注 |
Consumer< T > |
void accept(T t); |
接收一個參數,無返回值,即數據消費接口 |
Predicate< T > |
boolean test(T t); |
接收一個參數,返回布爾值,即數據判斷接口 |
Supplier< T > |
T get(); |
無參數,有返回值,即數據獲取接口 |
Function< T, R > |
R Apply(T t); |
接收T類型參數,返回R類型結果,即數據映射接口(一般輸入和輸出是不同類型的)
|
BiConsumer<T, U> |
void accept(T t, U u); |
接收兩個輸入,無返回值,數據消費接口 |
UnaryOperator<T> extends Function<T, T>
|
T accept(T t); |
接收一個參數,有返回值,輸入和輸出是相同類型,即數據映射接口 |
BiFunction<T, U, R>
|
R apply(T t, U u); |
接收2個輸入,有返回值,輸入和輸出是不同類型,即數據映射接口 |
BinaryOperator<T> extends BiFunction<T,T,T>
|
T apply(T t, T u); |
接收2個輸入,有返回值,輸入和輸出是相同類型,即數據映射接口 |
自定義函數式接口
通過上面的學習我們已經知道函數式接口的定義和分類,接下來我們實戰自定義函數式接口 。廢話不多說,代碼走起來。
定義一個無參無返回值的函數式接口

代碼示例1
定義包含default、static方法的無參有返回值的函數式接口

代碼示例2
定義有一個參數,無返回值的函數式接口

代碼示例3
自定義函數式接口測試
@Test
public void testMyFuncationInterface() {
// 1.無參無返回值
IBossService boss = () -> System.out.println(" invoke m3");
boss.m3();
// 2.無參有返回值
IBossService3<String> boss3 = () -> "m3";
boss3.m3();
// 3.有參無返回值
IBossService2<String> boss2 = e -> System.out.println("param:" + e);
boss2.m3("lambda");
// 4.有參有返回值
IBossService4<String, Integer> boss4 = e -> 1;
boss4.m3("lambda");
}
@FunctionalInterface
interface IBossService {
static int m2() {
return 2;
}
default void m1() {
System.out.println("m1");
}
void m3();
}
@FunctionalInterface
interface IBossService3<R> {
static int m2() {
return 2;
}
default void m1() {
System.out.println("m1");
}
R m3();
}
@FunctionalInterface
interface IBossService2<E> {
static int m2() {
return 2;
}
default void m1() {
System.out.println("m1");
}
void m3(E e);
}
@FunctionalInterface
interface IBossService4<T, R> {
static int m2() {
return 2;
}
default void m1() {
System.out.println("m1");
}
R m3(T t);
}