java8 Lambda 表示式和函式式介面快速理解
阿新 • • 發佈:2019-09-24
前言
接上篇文章 java8 新特性 由於上篇過於龐大,使得重點不夠清晰,本篇單獨拿出 java8 的 Lambda 表示式和函式式介面說明。
Lambda 表示式
lambda 表示式其實就是使用了新的語法結構來實現一個介面,並實現裡面的唯一的一個方法,用來代替以前的使用匿名內部類的方式。
// x 指引數列表 -> 後面表示處理過程,Consumer 沒有返回值 Consumer out = x -> System.out.println(x); // x,y 指引數列表 -> 後面表示處理過程和返回值 BinaryOperator<Integer> binaryOperator = (x,y) -> {return x > y ? 1 : -1 ;};
函式式介面
根據上面來看,其實就是實現了介面中的一個方法,所以這種介面有一個限制,只能有一個方法,像這樣的介面就叫函式式介面,你也可以當成正常的介面來使用。
Consumer<String> consumer = new Consumer<String>() {
@Override
public void accept(String o) {
System.out.println(o);
}
};
常用的函式式介面
我們基本不需要定義自己的函式式介面,Java8 已經給我們提供了大量的預設函式式介面,基本夠用,在 rt.jar
java.util.function
目錄下可以看到所有預設的函式式介面,大致分為幾類
Function<T,R>
T 作為輸入,返回的 R 作為輸出Predicate<T>
T 作為輸入 ,返回 boolean 值的輸出Consumer<T>
T 作為輸入 ,沒有輸出Supplier<R>
沒有輸入 , R 作為輸出BinaryOperator<T>
兩個 T 作為輸入 ,T 同樣是輸出UnaryOperator<T>
是Function
的變種 ,輸入輸出者是 T
其它的都是上面幾種的各種擴充套件,只為更方便的使用,下面演示示例,你可以把其當成正常的介面使用,由使用者使用 Lambda 來實現。
// hello world 示例
Function<String,String> function = (x) -> {return x+"Function";};
System.out.println(function.apply("hello world")); // hello world Function
UnaryOperator<String> unaryOperator = x -> x + 2;
System.out.println(unaryOperator.apply("9420-")); // 9420-2
// 判斷輸入值是否為偶數示例
Predicate<Integer> predicate = (x) ->{return x % 2 == 0 ;};
System.out.println(predicate.test(1)); // false
// 這個沒有返回值
Consumer<String> consumer = (x) -> {System.out.println(x);};
consumer.accept("hello world "); // hello world
// 這個沒有輸入
Supplier<String> supplier = () -> {return "Supplier";};
System.out.println(supplier.get()); // Supplier
// 找出大數
BinaryOperator<Integer> bina = (x, y) ->{return x > y ? x : y;};
bina.apply(1,2); // 2
方法引用
Supplier<DateTimeConvert> supplier = () -> new DateTimeConvert();
DateTimeConvert dateTimeConvert = supplier.get();
Consumer<DateTimeConvert> consumer1 = (x) -> x.toCalendar();
consumer1.accept(dateTimeConvert);
可能 java 的開發者覺得上面的操作還是太複雜了,又建立了一個語法 ::
來表示 Lambda 表示式
Supplier<DateTimeConvert> supplier2 = DateTimeConvert::new;
Consumer<DateTimeConvert> consumer2 = DateTimeConvert::toCalendar;
一點小推廣
創作不易,希望可以支援下我的開源軟體,及我的小工具,歡迎來 gitee 點星,fork ,提 bug 。
Excel 通用匯入匯出,支援 Excel 公式 部落格地址:https://blog.csdn.net/sanri1993/article/details/100601578 gitee:https://gitee.com/sanri/sanri-excel-poi
使用模板程式碼 ,從資料庫生成程式碼 ,及一些專案中經常可以用到的小工具 部落格地址:https://blog.csdn.net/sanri1993/article/details/98664034 gitee:https://gitee.com/sanri/