跳到主要內容

Lambda Expression And Functional Interfaces

  


頻道需要你的支持,謝謝你成為我們的會員(加入會員)

影片1 為什麼要學會寫 Lambda Expression ?



影片2 Lambda Expression 寫法的詳細解說1



影片3 Lambda Expression 寫法的詳細解說2



影片4 Java API 中常用 Functional Interface 的基礎樣式



影片5 Java API 中常用 Functional Interface 的搭配資本型態樣式  



影片6 Java API 中常用 Functional Interface 的兩個運算元樣式, 儲存Lambda Expression 與 Method Reference



範例

一、What is the Functional Interface?

只擁有一個抽象方法的界面。用來宣告方法的參數。讓方法呼叫者可以用 Lambda Expression 呼叫方法。簡化方法的呼叫。

二、Lambda Expression

1. 傳遞函數

運算式當參數源自於用函式當參數。

無論是用函式當參數還是用運算式當參數,主要是指定運算的方式。

l  Java SE 8之前的版本只接受用 / 物件 當參數。

n   把函式包裝在物件內。

n   把抽象方法宣告在介面中。

n   建立類別實作介面並在類別中定義運算。

n   把類別的物件當參數。

n   大量使用匿名類別。

l  Java SE 8()之後的版本接受用運算式(Lambda)當參數。

n   Java SE 8 開始,用 Lambda expression 取代匿名類別。可以讓程式碼更清楚、簡單。

2. What Is a Lambda?

n   本質上是一個匿名函數。

n   允許將函數視為數據。

n   提供行為的參數化。

3. Lambda expressions

l  Lambda expressions 是方法,用來作為呼叫另一個方法的呼叫敘述的參數。

n   輸入參數。

n   方法本體。
可以是單一運算式或程式區塊,用來運算參數。和一般方法的本體一樣,會在被呼叫時執行。

n   返回值。

l  Lambda Expression

n   () -> {} // No parameters; result is void

n   () -> 42 // No parameters, expression body

n   (int x) -> x+1 // Single declared-type parameter

n   (x) -> x+1 // Single inferred-type parameter

n   x -> x + 1 // Single inferred-type parameter

n   (int x, int y) -> x+y// Multiple declared-type parameters

n   (x, y) -> x+y// Multiple inferred-type parameters

n   x, y -> x+y// Compilation fails.

l  Lambda Parameters

n   lambda 運算式的參數形式可以是宣告型別 (declared types)或推斷型別(inferred types)

n   不可能宣告其某些參數的型別,而將其他參數留待推斷。

l  Lambda with Body

n   如同一般方法的本體,可以包含多個敘述,每個敘述以結束。

n   x -> System.out.println(x)

n   x -> {System.out.println(x);}

n   x ->  x+x

n   x -> { return x+x; }

三、Java API 中的常用 Functional Interface

Module : java.base

Package : java.util.functional

1. 基礎樣式

l  Consumer<T>

l  UnaryOperator<T>

l  Predicate<T>

l  Function<T,​R>

l  Supplier<T>

 

2. 搭配基本資料型態樣式

l  IntConsumer

l  IntPredicate

l  IntFunction<R>

l  IntToDoubleFunction

l  IntSupplier

l  ToIntFunction<T>

 

3. 兩個運算元

l  BiConsumer<T,​U>

l  BinaryOperator<T>

l  BiPredicate<T,​U>

l  BiFunction<T,​U,​R>

 

四、Method Reference

在某些狀況之下 Lambda expression 只是用來呼叫方法。

t -> t.toUpperCase()

在這種狀況之下你可以使用 method reference

String::toUpperCase

l Method reference

n   呼叫靜態方法。

ContainingClass::staticMethodName

n   呼叫實體方法。

ContainingClass::methodName

n   呼叫建構函式。

ClassName::new

五、儲存 Lambda Expression

FunctionalInterface name = Lambda Expression;

六、New Methods in ArrayList

l   void forEach​(Consumer<? super E> action)

l   boolean   removeIf​(Predicate<? super E> filter)

l   void replaceAll​(UnaryOperator<E> operator)