文章目录

  • lambda 表达式
    • 1. lambda表达式语法
    • 2. lambda表达式特点

lambda 表达式

lambda表达式 表示一个可调用的代码单元,没有命名的内联函数,不需要函数名因为我们仅是一次性的使用,不需要在 其他地方进行调用。

1. lambda表达式语法

[capture list](parameter list) -> return type {function body}
// [捕获列表](参数列表) -> 返回类型 {函数体}
// 只有[capture list] 和 {function body} 是必选的auto lam = []() -> int {cout << "Hello World!"; return 88;};
auto ret = lam();
cout << ret << endl;  //输出88

-> int :表示此匿名函数返回int, 大多数情况下 lambda表达式的返回值可由编译器猜测得出,因此不需要我们指定返回值类型。

2. lambda表达式特点

(1) 变量捕获才是成就lambda表达式的秘方
① [] 不捕获任何变量,这种情况下lambda表达式内部不能访问外部的变量
② [&] 以引用方式捕获所有变量 (保证lambda执行时,变量存在)
③ [=] 用值的方式捕获所有变量 (创建时拷贝,修改时对lambda内对象无影响)
④ [=, &foo] 以引用捕获变量foo,但其余变量都靠值捕获
⑤ [&, foo] 以值捕获foo,但其余变量都靠引用捕获
⑥ [bar] 以值方式捕获bar;不捕获其他变量
⑦ [this] 捕获所在类的this指针

int a = 1, b = 2, c = 3;
auto lam2 = [&, a]() { // b, c 以引用捕获,a以值捕获b = 5;c = 3;  // a = 1; a不能赋值cout << a << b << c << endl;
}
void fcn() { // 值捕获size_t v1 = 42;auto f = [v1] {return v1;};v1 = 0;auto j = f();    // j = 42; 创建时拷贝、修改对lambda内对象无影响
}
void fcn() { // 可变lambdasize_t v1 = 42;auto f = [v1] () mutablem {return ++v1;}; // 修改值捕获可以加mutablev1 = 0;auto j = f();    // j = 43;
}
void fcn()  { //引用捕获size_t v1 = 42; // 非constauto f = [&v1] () {return ++v1;};v1 = 0;auto j = f(); //注意此时 j = 1;
}

lambda 最大的一个优势是在使用STL中的算法(algorithms)库
例如: 数组排序

int arr[] = {6, 4, 3, 2, 1, 5};
bool compare(int& a, int& b) { // 谓词函数return a > b;
}
std::sort(arr, arr+6, compare);// lambda表达式形式
std::sort(arr, arr + 6, [](const int&a, const int& b) {return a > b;});// 降序排序
std::for_each(begin(arr), end(arr), [](const int& e) {cout<< "After:" << e << endl;});
// 6, 5, 4, 3, 2, 1

C11新特性六 —— lambda表达式相关推荐

  1. Java8 新特性:Lambda 表达式、方法和构造器引用、Stream API、新时间与日期API、注解

    Java8新特性:Lambda 表达式.方法和构造器引用.Stream API.新时间与日期API.注解 1.Java8新特性 1.1.主要的新特性: 1.2.编程风格 2.Lambda 表达式 2. ...

  2. java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合

    java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...

  3. JDK8新特性之Lambda表达式

    转载自 JDK8新特性之Lambda表达式 什么是Lambda表达式 Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁.当开发者在编写Lambda表达式时,也会随之被编译成 ...

  4. 【java8新特性】——lambda表达式与函数式接口详解(一)

    一.简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式.函数式接口.方法引用.默认方法.新工具(编译工具).Stream API.Date Time ...

  5. java8新特性之lambda表达式--超级详细版本

    java8新特性之lambda表达式 1.什么是lambda表达式?为什么用它? 2. 为什么Java需要lambda表达式? 3. lambda表达式的语法 4.函数式接口 4.1 什么是函数式接口 ...

  6. 深圳Java培训学习:Java8.0新特性之Lambda表达式--【千锋】

    深圳Java培训学习:Java8.0新特性之Lambda表达式–[千锋] 前言 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.本篇文章,主要给大家介绍的是lambda表 ...

  7. java x=8_Java8新特性之lambda表达式

    简介 Java8带来的新特性之一Lambda表达式,又称之为函数式编程,核心思想是将面向对象中的传递对象变为传递行为 语法 expression = (variable) -> anction ...

  8. lambda 对象去重_最火的java8新特性:Lambda 表达式

    主要内容 1. Lambda 表达式 2. 函数式接口 3. 方法引用与构造器引用 4. Stream API 5. 其他新特性 Java 8新特性简介 速度更快 代码更少(增加了新的语法 Lambd ...

  9. JDK 8 新特性 之 Lambda表达式

    前言 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为参数传递进方法中. 使用 Lambda 表达式可以使代码变的更加简洁紧凑. lamb ...

最新文章

  1. WebGoat教程学习(三)--Ajax安全
  2. oppor17android版本,OPPOR17ColorOS系统怎么样
  3. 面试官问你想找什么工作_找工作时如何面试面试官
  4. 源码测评:来客推开发源码能用来做什么模式的商城?B2B2C?S2B2C?云集模式?淘宝模式?
  5. 数组常用解题方法(持续更新)
  6. MDaemon使用技巧大全--新建账户欢迎文件的设置
  7. Codeigniter 获取当前的控制器名称和方法名称
  8. c语言怎么让两个函数同时进行_Excel高级筛选怎么用同时满足多个条件进行筛选...
  9. mybatis执行批量更新batch update 的方法(oracle,mysql)
  10. php多级查询,MySQL 多级查询
  11. Pandas系列(十二)实现groupby分组统计
  12. gitlab+jenkins+maven+docker持续集成(二)——maven安装配置
  13. AI红包皮速领,人类现金速抽|祝大家新春快乐
  14. 阿里企业邮箱的POP地址
  15. spring data JPA常用注解
  16. 深度学习-图片识别(上)
  17. 去法国,买哪些伴手礼既有面子又不破费
  18. 【社媒营销】四大跨境营销渠道分析
  19. 你听播客吗?聊聊最近大火的声音经济
  20. Redis-benchmark性能测试工具使用详解

热门文章

  1. 如何伦敦金走势图中的涨跌规律
  2. Linux桌面新版宠物Mint 10正式发布
  3. O’Reilly动物书系列
  4. Python——sqlalchemy.exc.ArgumentError
  5. python三局游戏游戏代码_Python实现忍让三局交换码的自动采集,python,忍三,游戏,兑换,全族,领取...
  6. 全面屏惊艳!大神制作 iPhone 8开箱视频来了
  7. 打印时提示计算机的内存不足,电脑中使用惠普P4510打印机打印时出现内存不足怎么处理...
  8. “大闸蟹” 英语怎么说?
  9. 突然怀念小时弹玻璃球的日子
  10. 一封史上最牛的求职信!