java的Lambda、groovy的closure、Kotlin的Lambda和c++2.0的Lambda

目录

java的Lambda

文法:

举例:

详情链接:

groovy的closure

文法:

举例:

详情链接:

Kotlin的Lambda

文法:

举例:

 详情链接:

c++2.0的Lambda

文法:

举例:

详情链接:


 

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

 

请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值