C++11 Lamada表达式

本文详细介绍了C++11中的Lamada表达式,包括其定义、组成部分及如何使用。Lamada表达式是C++11的重要特性,文章解释了其捕获列表、参数列表、mutable选项、throw选项、返回类型及函数体的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Lamada表达式是C++11最重要也是最常用的特性之一。Lamada来源于函数式编程的概念,也是现代编程语言的一个特点。

Lamada表达式定义
下图展示出了C++ Lamada表示的组成部分:
在这里插入图片描述
其中:
① 指明捕获列表
② 指明参数列表
③ mutable可选项。和常规的mutable用法类似,即当lamada表达式参数是const时,使用mutable可以取消这种const.
④ throw可选项。和常规的throw用法类似,即用于指明lamada函数体不会抛出异常。
⑤ 指定返回类型
⑥ Lamada函数体

根据上图定义一个完整的lamada表达式:

auto f = [](int a) throw() -> int { return a + 1; };

返回类型
很多时候lamada表达式的返回值类型是非常明显的,编译器可以根据return语句自动推导出返回类型,这个时候我们可以省略表达式的返回值定义:

auto x1 = [](int a) {return a + 1};     // OK: return type is int

但是,初始化列表不能用于返回值的自动推导:

auto x2 = [](int a) {return {a+1, a+2}; };   // error: 无法推导出返回值类型

捕获列表
lamada表达式可以通过捕获列表捕获一定范围内的变量:

[] 不捕获任何变量。
[&] 按引用捕获:捕获外部作用域中的所有变量,并作为引用在函数体中使用。
[=] 按值捕获:捕获外部作用域中的所有变量,并作为副本在函数体中使用。
[=, &foo] 按值捕获外部作用域中的所有变量,并按引用捕获foo变量。
[bar] 按值捕获bar变量,同时不捕获其他变量。
[this] 捕获lamada所在的当前类中的this指针,让lamada表达式拥有和当前类成员函数同样的访问权限。如果已经使用了&或=,就默认添加此选项。捕获this的目的是可以在lamada中使用当前类的成员函数和成员变量。

原文链接:https://blog.youkuaiyun.com/china_jeffery/article/details/80771158

### Lambda 表达式与 `GroupBy` 的使用 在 Java 中,`Stream API` 提供了强大的功能来处理集合数据。其中,`groupingBy` 是一种常用的收集器 (Collector),用于按照某个条件对流中的元素进行分组。 #### 基本语法结构 为了利用 `groupingBy` 进行分组操作,通常会结合 `Collectors.groupingBy()` 方法,并传入一个分类函数作为参数。此函数定义如何根据对象属性或其他逻辑来进行分组[^1]。 ```java import java.util.*; import java.util.stream.Collectors; class Person { private String name; private int age; public Person(String name, int age){ this.name = name; this.age = age; } public String getName(){ return name; } public int getAge(){ return age; } } public class GroupByExample { public static void main(String[] args) { List<Person> people = Arrays.asList( new Person("Alice", 30), new Person("Bob", 25), new Person("Charlie", 30) ); Map<Integer, List<Person>> groupedPeople = people.stream() .collect(Collectors.groupingBy(Person::getAge)); groupedPeople.forEach((age, persons) -> { System.out.println("Age " + age + ":"); persons.forEach(person -> System.out.println("- " + person.getName())); }); } } ``` 这段代码展示了如何通过年龄 (`Person::getAge`) 对人员列表进行分组。最终结果是一个映射表,键为不同的年龄段,而值则对应于该年龄段下的所有人名单。 对于更复杂的场景,还可以嵌套多个 `groupingBy` 或者与其他收集器组合起来一起工作,比如统计每组的数量、求平均数等额外的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值