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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章