如何使用Stream从对象中提取多个属性值添加到同一个列表
实现方法
可以实现,使用Stream的flatMap操作即可完成需求,示例代码如下:
import java.util.stream.Stream; import java.util.stream.Collectors; // 原有代码 List<MyObject> myObject = new ArrayList<>(); // 已填充myObject数据 // 单条语句同时收集两个属性值 List<Long> ids = myObject.stream() .flatMap(item -> Stream.of(item.getJobId(), item.getTestId())) .collect(Collectors.toList());
原理解释
- 你之前使用的
map操作是1对1映射:每个MyObject实例只会输出1个jobId值,所以最终列表仅包含所有对象的jobId flatMap是1对多映射:每个MyObject实例会先生成包含jobId和testId两个值的小流,flatMap会自动把所有小流拼接成一个总的Long类型流,最终收集后就会把两个属性的所有值都存入同一个列表。- 最终列表的元素顺序为:第一个对象的jobId → 第一个对象的testId → 第二个对象的jobId → 第二个对象的testId,以此类推。
可选优化
如果使用Java 16及以上版本,可以省略Collectors简化写法:
List<Long> ids = myObject.stream() .flatMap(item -> Stream.of(item.getJobId(), item.getTestId())) .toList();
如果需要过滤属性为空的情况,可追加filter操作:
import java.util.Objects; List<Long> ids = myObject.stream() .flatMap(item -> Stream.of(item.getJobId(), item.getTestId())) .filter(Objects::nonNull) .collect(Collectors.toList());
内容的提问来源于stack exchange,提问作者user2108383
相关产品推荐
相关产品推荐

