摘要:本文主要向大家介绍了C++语言:Lambda表达式,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。
本文主要向大家介绍了C++语言:Lambda表达式,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。
1.什么是Lambda表达式?
Lambda表达式是函数式编程的重要的语法结构。
Lambda 表达式(lambda expression)说起来很简单,就是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包。(注意和数学传统意义上的不同)。(本质上Lambda表达式就是将函数作为是一个匿名对象进行操作)
其实缺少Lambda表达式的编程语言并不会影响编程语言的逻辑表达,Lambda表达式核心就是提供一个好用的语法糖:可以直接定义一个函数,而不需要将定义函数和语法内容分开,这样有助于将逻辑用更紧凑的方式表达出来。假如需要定义一个函数,恰巧这个函数仅仅使用一次,然后又需要给它定义一个名字,作为懒惰的程序员就需要搬出Lambda表达式了。咱们看一段Python代码,过滤一个list之中的偶数,这是一个很简单的需求,我们先看看不使用Lambda表达式的方式:
def isOdd(n):
return n & 1;
nums = [1,2,3,4,5,6]
nums = filter(isOdd,nums)
显然这里需要额外定义一个代码逻辑十分麻烦:首先需要跳脱出运行代码而去查看定义的isOdd函数的代码,其次,这里需要实现的过滤逻辑很简单。这种场合是最适合使用Lambda表达式的场景,我们来看看Lambda表达式是怎么优化上述代码的:
nums = [1,2,3,4,5,6]nums = filter(lambda x:x & 1,nums)
好吧,很优雅的用Lambda表达式解决了同样的需求,表述也十分清晰:
下面的几个使用场景是适用于Lambda表达式的:
· (1)代码定义的逻辑与执行逻辑对接的更加紧凑。
· (2)代码更加简洁。
· (3)能够支持闭包。
2.C++之中的Lambda表达式
C++在C++11之中添加了Lambda表达式的语法结构,Lambda语法结构如下所示:
[capture](parameters)->return-type {body}
接下来,我们来一一分析各个部分所代表的含义,以及具体的使用方式:
· [capture]
capture代表捕获外部的变量,这个使用的方式笔者在上一篇有关闭包的内容之中就有过示例,变量捕获是Lambda表达式之中,最为复杂的一环,我们来看一看其中各种表示方式的含义:
· [] 不捕获任何变量(但是必须得写,编译器通过捕获结构识别Lambda表达式)
· [&} 通过引用的方式捕获外部作用域中所有变量
· [=] 通过拷贝的方式捕获外部作用域中所有变量
(上述两种方式都过于粗暴了,实际的话,尽量采用下面的模式来限定所引用的变量,不要随意引用)
· [x, &y] x按值传递,y按引用传递
· [this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
可以看到,[capture]的语法结构捕获了外部变量,通过这样的方式实现了闭包。
·
(parameters)
这个部分很简单,类似于通常函数使用的参数列表,使用方式也没有区别。
·
·
->return-type
显式指明由Lambda表达式所返回的返回值类型。这里通常建议不写,因为C++编译器会通过类型推断的方式来推断出函数的返回值类型,而且前面的->也可以省略。
·
·
{body}
花括号括起来的函数体,则没什么好说的了,就是实现函数逻辑的部分了。
·
同样的,我们来看看上文用python实现的过滤偶数的代码在C++之中是如何实现的:
vector<int> nums = {1,2,3,4,5,6,7};
vector<int> newNums(nums.size());
auto last = copy_if(nums.cbegin(), nums.cend(),newNums.begin(),[](int x){return !(x & 1);});
for_each(newNums.begin(), last, [](int x) {
cout << x << endl;
});
和python的实现相比,由于缺少了链式调用的方式,所以看起来C++实现的版本并没有简化多少应用逻辑,反而看起来略显杂乱。但是这并不妨碍我们在适当的地方运用Lambda表达式,来优化我们的代码结构。
3.其他语言与Lambda表达式
·
Java
Java在Java 8的版本终于千呼万唤始出来的Lambda表达式确实是让个人很喜欢,个人也觉得Java 8对于Java这门语言有极其深远的影响。我们来看看Java之中是如何实现上文的逻辑的:
·
public static void main(String[] args) {
int[] nums = {1,2,3,4,5,6,7};
IntStream.of(nums).filter((x)->{return (x & 1) == 1;}).forEach(System.out::println);
}
·
相比C++而言优雅了很多,而且参数类型也能做到类型推断,对程序员来说确实更加友好了。
·
坦白说:Java是一门很幸运的语言,更上了移动开发,大数据的浪潮。不过随着Google与Oracle的官司,不知道Java未来是否还能继续现在的强势地位。
· Golang
没有Lambda表达式,咱们要的是简洁明晰,不要学Geek那一套玩意。
4.小结
感觉本文干货有点略少,吐槽略多,见谅哈~~~。关于C++之中的Lambda表达式就和大家聊到这里,希望大家在实际Coding之中可以用好它,来尽量简洁化自己的代码结构。
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号