Stream通过实体多属性重新构建

这篇博客介绍了如何在Java中利用Stream API的flatMap方法,将一个包含Organization对象的列表转换为一个由orgName和orgCode属性组成的String类型的Set集合。通过示例代码展示了如何将多个Organization对象的属性合并到一个集合中,实现了数据的重组和去重。

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

需求背景:使用实体里的多个属性重新构建集合

模拟需求:已知Organization对象有orgCode、orgName两个属性,同为String类型,现有多个Organization对象构成的list对象,需使用上述两个属性重新构建一个泛型为String的Set集合。

本质是合并流FlatMap的使用。

List<Organization> a = new ArrayList<>();
        Organization organization1 = new Organization();
        organization1.setOrgName("aa");
        organization1.setOrgCode("bb");
        Organization organization2 = new Organization();
        organization2.setOrgName("cc");
        organization2.setOrgCode("dd");

        Organization organization3 = new Organization();
        organization3.setOrgName("tt");
        organization3.setOrgCode("bb");

        a.add(organization1);
        a.add(organization2);
        a.add(organization3);
        Set<String> set2 = a.stream().flatMap(o -> Stream.of(o.getOrgName(),o.getOrgCode())).collect(Collectors.toSet());
        set2.forEach(System.out::println);

输出为:

aa
bb
cc
dd
tt

符合预期

### 使用 Java Stream API 对实体类字段进行赋值 在处理大量数据时,Java Stream API 提供了一种简洁而强大的方式来操作集合中的元素。对于更新或设置实体类的字段值,通常的做法是在的操作链中使用 `map` 方法配合 lambda 表达式完成。 下面是一个具体的例子,展示如何利用 Stream API 更新列表中每个对象的一个特定属性: 假设有一个电影实体类 `PMovieDO2`,其中包含了一个名为 `fz` 的整型字段以及相应的 setter 和 getter 方法[^1]。 ```java public class PMovieDO2 { private Integer id; private Integer fz; private String movid; // Getters and Setters... public void setFz(Integer fz) { this.fz = fz; } public Integer getFz() { return fz; } } ``` 现在有这样一个需求:给定一个 `List<PMovieDO2>` 类型的对象列表,想要通过某种逻辑计算新的 `fz` 值并将其应用到每一个实例上。可以这样做: ```java import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; // 创建一些测试数据 List<PMovieDO2> movies = new ArrayList<>(); movies.add(new PMovieDO2()); movies.add(new PMovieDO2()); // 定义一个新的fz值生成器方法或其他业务逻辑 Integer generateNewFZValue(PMovieDO2 movie){ // 这里只是一个简单的示例实现;实际场景下可能更复杂 return movie.getFz() != null ? movie.getFz() * 2 : 0; } // 应用Stream API修改每个movie对象的fz属性 List<PMovieDO2> updatedMovies = movies.stream() .peek(movie -> movie.setFz(generateNewFZValue(movie))) .collect(Collectors.toList()); ``` 在这个片段中,`.peek()` 是用来执行副作用的方法,在这里用于调用 `setFz` 来改变原始对象的状态。注意 `.peek()` 不会创建新对象而是直接改变了输入序列里的元素。如果希望保持不可变性,则应该考虑构建全新的对象副本而不是更改现有对象。 最后收集结果回到一个新的列表变量 `updatedMovies` 中去保存这些被更新后的记录。 #### 注意事项 - 当使用像 `.peek()` 这样的中间操作来进行状态变更的时候要小心,因为这违反了函数式的无副作用原则。 - 如果不需要保留原列表不变,可以直接对原来的引用做变换而不必重新收集至另一个变量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值