1. 程式人生 > >java8 Lambda 表示式和函式式介面快速理解

java8 Lambda 表示式和函式式介面快速理解

前言

接上篇文章 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/