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表示式來建立該介面的物件 演化過程 一般我們定義介面 例項化介面方法,程式呼叫...