Java8 Stream:如何在单流中映射Model类的两个属性
嘿,我来帮你搞定这个Stream转换的问题!你一开始用mapFirst的思路不对哦——mapFirst只会处理流里的第一个元素,提取它的stringA,这显然没法帮你收集所有Model里的stringA和stringB。
要实现把每个Model的两个字符串属性都收集到同一个List里,最适合的Stream操作是**flatMap**,它能把每个元素映射成多个元素的流,再把所有流合并成一个单一的流。具体代码如下:
import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; // 你的Model类保持不变 class Model { private String stringA; private String stringB; public Model(String stringA, String stringB) { this.stringA = stringA; this.stringB = stringB; } public String getStringA() { return stringA; } public String getStringB() { return stringB; } } // 完整转换逻辑 List<String> strings = models.stream() .flatMap(model -> Stream.of(model.getStringA(), model.getStringB())) .collect(Collectors.toList());
简单解释一下:
flatMap(model -> Stream.of(model.getStringA(), model.getStringB())):把每个Model对象转换成一个包含它的stringA和stringB的小Stream;flatMap会自动把所有这些小Stream合并成一个连续的Stream<String>。collect(Collectors.toList()):把最终的流收集成List<String>。
如果你的Model属性可能存在null值,还可以加上过滤步骤,避免把null放进结果List里:
import java.util.Objects; List<String> strings = models.stream() .flatMap(model -> Stream.of(model.getStringA(), model.getStringB())) .filter(Objects::nonNull) // 过滤掉null元素 .collect(Collectors.toList());
这样就能一次性完成所有属性的收集啦!
内容的提问来源于stack exchange,提问作者Sunflame
相关产品推荐
相关产品推荐

