java學習 lambda表示式

2021-07-25 07:29:59 字數 2599 閱讀 3705

public

class

lambda

public

static

void main(string args)

// sort函式的第二個引數需要乙個實現了comparator介面的類的物件

arrays.sort(strings, new lengthcomparator());

for(string str : strings)

// 下方lambda表示式中的引數列表(string first, string second)的型別名string,

// 若能從上下文推斷出來則不需指定

// 若引數只有乙個,且型別可以由上下文推斷出來,則小括號也可以省略

// 若沒有引數,小括號不能省略

// 這是expression lambda,不需要寫return,直接將該表示式的結果返回

arrays.sort(strings, (string first, string second) -> integer.compare(second.length(), first.length()));

for (string str : strings)

// 若需要寫多行則用{}將後面的表示式括起來

// 這是statement lambda,return要顯示的寫出來

arrays.sort(strings, (string first, string second) -> else

if (first.length() == second.length()) else

});for (string str : strings)

}}class

lengthcomparator

implements

comparator

}

如果乙個藉口僅有乙個抽象方法,就稱為函式式介面,比如runnable,comparator,在任何需要functional inte***ce的地方,都可以用lambda表示式

上面**中,

arrays.sort(strings, (string first, string second) -> integer.compare(second.length(), first.length()));
這裡,sort()的第二個引數應該是乙個comparator的物件,而comparator是乙個functional inte***ce,因此可以直接傳入lambda表示式,在呼叫該物件的compare(),就是執行該lambda表示式的語句體

如果lambda表示式的語句體會丟擲異常,則對應的functional inte***ce的抽象方法必須丟擲該異常,否則就需要在lambda表示式中顯示的捕獲該異常

runnable r = () ->  catch (interruptedexception e) {}

};

如上**中要捕獲異常是因為runnable介面的唯一的方法run方法沒有丟擲該異常

以下兩種表達方式等價

(x) -> system.out

.println(x)

system.out::println

其中第二行就是method reference

method reference由三種形式

1. object::instancemethod

system.out::println

(x) -> system.out

.println(x)

class::staticmethod

math::pow 

(x, y) -> math.pow(x, y)

class::instancemethod

string::comparetoignorecase

(s1, s2) -> s1.comparetoignorecase(s2)

其中,第三種方式會將第乙個引數作為物件,呼叫方法,將其他的引數作為方法的引數使用

如下**

public

class lambda

public

static

void

repeatmessage(string text, int count)

};new thread(r).start();

}}

注意看lambda表示式中的變數count和text,它們並沒有在lambda 表示式中被定義,而是repeatmessage方法中的變數。而在yield之後,repeatmessage返回了,此時引數變數已經消失了,那麼lambda如何保留text和count的呢?

我們可以說,lambda捕獲了text和count兩個值,在lambda表示式中,不能修改捕獲的值。

比如,在lambda中加入一句

--;會報錯!

另外,lambda表示式中不允許宣告乙個和區域性變數同名的引數或者區域性變數

在lambda中使用this時,this是它所在方法的類的物件

參考:

lambda表示式 lambda表示式

1.概述 c 11 中的 lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda 的語法形式如下 函式物件引數 操作符過載函式引數 mutable 或 exception 宣告 返回值型別可以看到,lambda 主要分為五個部分 函式物件引數 操作符過載函式引數 muta...

lambda表示式學習

lambda表示式的基本形式,如下 capture list params list key word mutuble return type說明 1 capture list 裡面的內容具體形式如下 2 params list 輸入引數,這個和普通的函式一樣 3 keyword mutuble 預...

Lambda表示式學習

看完肯定會有幫助 理解functional inte ce 函式式介面 是學習lambda表示式的關鍵 函式式介面的定義 任何介面,如果只包含唯一乙個抽象方法,那麼它就是乙個函式式介面。對於函式式介面,可以通過lambda表示式來建立該介面的物件 演化過程 一般我們定義介面 例項化介面方法,程式呼叫...