如何在Stream操作中对所有非null节点执行normalize后调用findFirst()
解决方案:批量处理非null节点的normalize操作
嘿,我完全懂你想要的效果——在一次Stream操作里搞定所有非null的b1、b2、b3,统一执行normalize,省得之后还要到处做null检查对吧?
之前你用findFirst().map(...)只处理第一个元素,是因为findFirst()本身就是终止操作,只会取出流里的第一个元素,所以map自然只作用在那一个上。要实现批量处理所有非null实例,咱们可以换个思路:
方法1:将所有对象放入Stream批量处理
把b1、b2、b3打包成一个Stream,先过滤掉null,再统一执行normalize,最后收集结果(如果需要保留处理后的实例的话):
import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.Objects; // 批量处理所有非null的节点 List<TrNode> normalizedNodes = Stream.of(b1, b2, b3) .filter(Objects::nonNull) // 先筛掉null .map(TrNode::normalize) // 对每个非null节点执行normalize .collect(Collectors.toList()); // 收集处理后的结果
这样一来,所有非null的b1/b2/b3都会被处理,而且返回的normalizedNodes里绝对没有null,后续直接用就行,不用再做null检查。
方法2:直接替换原变量(如果需要保留原引用)
如果你不想收集到集合里,而是想直接把b1/b2/b3替换成处理后的实例,也可以用Stream结合循环来做:
Stream.of(new TrNode[]{b1, b2, b3}) .filter(Objects::nonNull) .map(TrNode::normalize) .forEach(node -> { // 这里可以根据节点的唯一标识(比如id)替换原变量 if (node.getId().equals(b1.getId())) b1 = node; else if (node.getId().equals(b2.getId())) b2 = node; else if (node.getId().equals(b3.getId())) b3 = node; });
不过这种方法需要节点有唯一标识来匹配原变量,如果你的b1/b2/b3没有这类标识,那用Optional逐个处理会更直接:
b1 = Optional.ofNullable(b1).map(TrNode::normalize).orElse(null); b2 = Optional.ofNullable(b2).map(TrNode::normalize).orElse(null); b3 = Optional.ofNullable(b3).map(TrNode::normalize).orElse(null);
虽然这不是单次Stream操作,但写法简洁,同样能避免后续的null检查。
总结一下,最贴合你“同一次Stream操作处理所有非null实例”需求的是方法1,把所有对象放进Stream批量过滤+映射,一次性完成所有处理~
内容的提问来源于stack exchange,提问作者user4695271
相关产品推荐
相关产品推荐

