如何使用Java 8 Stream流将给定Java 7代码正确改写
错误代码问题说明
- 空校验缺失:直接调用
input.getList().stream(),如果input.getList()为null会直接触发空指针,没有覆盖原Java7代码中list为null的分支逻辑。 - 拼接逻辑错误:使用
Stream.concat拼接原流和过滤后的原流,即便过滤逻辑正确也会出现元素重复,不符合「只补充不存在的id」的需求。 - 缺少终端操作:Stream是惰性求值的,仅声明中间操作不会实际执行计算,也无法生成新的List集合赋值给Input对象。
- 过滤逻辑不合理:filter参数
list2是集合中存储的Long类型元素,和判断集合是否包含id的逻辑完全无关,同时也未处理id为null的场景。
正确Stream改写方案
改写逻辑完全对齐原Java7代码的分支判断,所有空校验场景全覆盖:
import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; // 业务逻辑部分 Optional.ofNullable(input.getId()) .ifPresent(id -> { List<Long> processedList = Stream.concat( // 原list为null时返回空流,否则返回原list的元素流 Optional.ofNullable(input.getList()).map(List::stream).orElseGet(Stream::empty), // 仅当需要补充id时返回单元素流,否则返回空流 Optional.ofNullable(input.getList()) .filter(list -> !list.contains(id)) .map(list -> Stream.of(id)) .orElseGet(() -> input.getList() == null ? Stream.of(id) : Stream.empty()) ).collect(Collectors.toList()); input.setList(processedList); });
逻辑说明:
- 外层用
Optional.ofNullable(input.getId())判断id非空,id为空时不执行任何操作,和原逻辑一致。 - 原list为null时,concat的第一个流是空流,第二个流返回
Stream.of(id),最终生成的list仅包含当前id,对齐原代码else分支的新建List逻辑。 - 原list非空时,如果id不在list中就把id拼接到原元素流后,否则不拼接,和原代码if分支的逻辑完全一致。
内容的提问来源于stack exchange,提问作者Rahul Agrawal
相关产品推荐
相关产品推荐

