目錄
java的Lambda
文法:
(arg1, arg2...) -> { body }
(type1 arg1, type2 arg2...) -> { body }
舉例:
(int x, int y) -> { return x + y; }
(x, y) -> x + y
x -> x * x
() -> x
x -> { System.out.println(x); }
x -> String.valueOf(x)
x -> x.toString()
() -> x.toString()
() -> new ArrayList<>()
Comparator<String> c = (a, b) -> Integer.compare(a.length(), b.length());
詳情鏈接:
https://blog.csdn.net/liao_hb/article/details/90081652#Lambdas
groovy的closure
文法:
{ [closureParameters -> ] statements }
舉例:
{ item++ } //一個引用名爲item的變量的閉包
{ -> item++ } //通過添加箭頭( - >)可以明確地將閉包參數與代碼分開
{ println it } //使用隱式參數(it)的閉包
{ it -> println it } //上面的一個替代版本,它是一個顯式參數
{ name -> println name } //在這種情況下,通常最好爲參數使用顯式名稱
{ String x, int y -> //一個閉包接受兩個類型參數
println "hey ${x} the value is ${y}"
}
{ reader -> //閉包可以包含多個語句
def line = reader.readLine()
line.trim()
}
def code = { 123 }
assert code() == 123
詳情鏈接:
https://blog.csdn.net/liao_hb/article/details/88690400
Kotlin的Lambda
文法:
val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y }
舉例:
val product = items.fold(1) { acc, e -> acc * e }//拖尾 lambda 表達式
run { println("...") }//該 lambda 表達式是run函數調用時唯一的參數
//如果lambda 表達式只有一個參數,可以不用聲明唯一的參數並忽略 ->,可以使用隱式參數it:
ints.filter { it > 0 } // 這個字面值是“(it: Int) -> Boolean”類型的
ints.filter {
val shouldFilter = it > 0
shouldFilter
}
//等價於
ints.filter {
val shouldFilter = it > 0
return@filter shouldFilter
}
//LINQ-風格的代碼
strings.filter { it.length == 5 }.sortedBy { it }.map { it.toUpperCase() }
//如果 lambda 表達式的參數未使用,那麼可以用下劃線取代其名稱:
map.forEach { _, value -> println("$value!") }
//如果 lambda 表達式具有 Pair 類型(或者 Map.Entry 或任何其他具有相應 componentN 函數的類型)
//的參數,那麼可以通過將它們放在括號中來引入多個新參數來取代單個新參數:
//解構Map.Entry爲(key, value):
map.mapValues { entry -> "${entry.value}!" }
map.mapValues { (key, value) -> "$value!" }
map.mapValues { (_, value): Map.Entry<Int, String> -> "$value!" }
map.mapValues { (_, value: String) -> "$value!" }
{ a //-> …… } // 一個參數
{ a, b //-> …… } // 兩個參數
{ (a, b) //-> …… } // 一個解構對
{ (a, b), c //-> …… } // 一個解構對以及其他參數
帶有接收者的函數類型,例如 A.(B) -> C ,可以用特殊形式的函數字面值實例化—— 帶有
接收者的函數字面值。這裏有一個帶有接收者的函數字面值及其類型的示例,其中在接收者對象上調用了 plus :
val sum: Int.(Int) -> Int = { other -> plus(other) }
//匿名函數語法允許你直接指定函數字面值的接收者類型。 如果你需要使用帶接收者的函數類
//型聲明一個變量,並在之後使用它,這將非常有用。
val sum = fun Int.(other: Int): Int = this + other
當接收者類型可以從上下文推斷時,lambda 表達式可以用作帶接收者的函數字面值。
class HTML {
fun body() { …… }
}
fun html(init: HTML.() -> Unit): HTML {
val html = HTML() // 創建接收者對象
html.init() // 將該接收者對象傳給該 lambda
return html
}
html { // 帶接收者的 lambda 由此開始
body() // 調用該接收者對象的一個方法
}
詳情鏈接:
c++2.0的Lambda
文法:
捕獲形式 說明
[] 不捕獲任何外部變量
[i, …] 以值得形式捕獲指定的多個外部變量(用逗號分隔);如果引用捕獲,需要顯示聲明&
[this] 以值的形式捕獲this指針
[=] 以值的形式捕獲所有外部變量
[&] 以引用形式捕獲所有外部變量
[=, &x] 變量x以引用形式捕獲,其餘變量以傳值形式捕獲
[&, x] 變量x以值的形式捕獲,其餘變量以引用形式捕獲
舉例:
auto i = 5;
// [&] 表示外部變量都以引用的形式在lambda中使用,函數內部修改i的值會影響外部
// 這裏的 -> auto 自動推導在c++11不支持,c++14中對auto進行了擴展
thread t1([&] () -> auto {
i = 100;
cout << "線程:" << i << endl;
});
_sleep(10);
cout << i << endl;
詳情鏈接:
https://blog.csdn.net/liao_hb/article/details/82221804#Lambda%C2%A0
請註明出處。