list.stream().map().collect() 的含义

本文深入探讨了Java 8中Stream API的使用方法,通过具体案例解释了list.stream().map().collect()的功能,对比了传统for循环和lambda表达式的不同写法,帮助读者理解并掌握这一高效的数据处理方式。

list.stream().map().collect() 的含义

起因:最近在学习别人的源码的时候,在登陆验证权限的时候看到了这样一坨代码

List<Role> roles = roleDao.selectByUserId(user.getId());
List<Long> roleIds = roles.stream()
      .map(Role::getId)
      .collect(Collectors.toList());

傻傻的我看到之后虽然知道这是1.8新特性,但是因为没接触过而不知道是什么意思,搜索了一番便在这里记录一下,上面的代码换成咱熟悉的代码就是长这个样子的

List<Role> roles = roleDao.selectByUserId(user.getId());
List<Long> roleIds = new ArrayList<>();
for (Role role : roles) {
      roleIds.add(role.getId());
}

查找了一些资料之后还发现,用java8 api 方法还有另外一种写法

List<Role> roles = roleDao.selectByUserId(user.getId());
List<Long> roleIds = roles.stream()
      .map(role -> role.getId())
      .collect(Collectors.toList());
Java 中,`List` 的流操作通过 `Stream` 提供了强大的数据处理能力。其中,`map` 方法是 `Stream` API 中的核心操作之一,用于对流中的元素进行转换处理。`map` 方法接受一个函数作为参数,将该函数应用到流中的每个元素上,并返回一个新的流,其中包含经过转换后的元素。 ### 使用 `map` 方法的基本语法 ```java List<ReturnType> transformedList = originalList.stream() .map(element -> transformFunction.apply(element)) .collect(Collectors.toList()); ``` `map` 方法的参数是一个 `Function` 函数式接口的实现,可以使用 Lambda 表达式或方法引用来定义转换逻辑。 ### 示例:使用 Lambda 表达式转换元素 假设有一个 `PaymentRecord` 类,并希望根据订单编号提取记录的描述信息: ```java List<String> orderDescriptions = paymentRecords.stream() .map(pr -> pr.getOrderNo() + ": " + pr.getDescription()) .collect(Collectors.toList()); ``` 此操作将每个 `PaymentRecord` 对象映射为一个字符串,格式为“订单编号: 描述”[^1]。 ### 示例:使用方法引用简化代码 如果转换逻辑已经封装在某个方法中,可以直接使用方法引用简化代码。例如,若 `PaymentRecord` 类中包含 `getOrderNo` 方法: ```java List<String> orderNumbers = paymentRecords.stream() .map(PaymentRecord::getOrderNo) .collect(Collectors.toList()); ``` 此写法等效于使用 Lambda 表达式 `pr -> pr.getOrderNo()`,但更简洁且可读性更高[^1]。 ### 示例:结合 `flatMap` 实现复杂数据结构的转换 当处理嵌套集合时,`map` 通常与 `flatMap` 配合使用。例如,将 `List<List<Integer>>` 转换为一个扁平化的 `List<Integer>`: ```java List<Integer> flatList = nestedLists.stream() .flatMap(List::stream) .map(i -> i + 1) .collect(Collectors.toList()); ``` 上述代码首先使用 `flatMap` 将每个子列表转换为一个流,然后合并所有流为一个整体流,最后通过 `map` 对每个元素执行加 1 操作[^2]。 ### 示例:链式操作与最终收集结果 `map` 通常作为流操作链的一部分使用,最终通过 `collect` 方法将结果收集到集合中。例如,将字符串列表转换为大写形式: ```java List<String> upperCaseList = stringList.stream() .map(String::toUpperCase) .collect(Collectors.toList()); ``` 此代码将列表中的每个字符串转换为大写形式,并收集为一个新的列表[^1]。 ### 注意事项 - `map` 方法不会修改原始集合中的元素,而是生成一个新的流。 - 转换过程中若涉及对象状态修改,需确保线程安全。 - 使用 `map` 时,应避免在 Lambda 表达式中执行副作用操作(如修改外部变量),以保持函数式编程的纯度。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值