Java 8中将for循环替换为Stream流后列表为空如何解决
代码问题分析
- 逻辑完全倒置:你编写的Stream代码的处理方向和原始逻辑完全相反。原始逻辑是遍历
nsVrsList,把possibleValues.getValues()里不存在对应name的新对象加进去,而你的代码是从possibleValues.getValues()现有元素里筛选和nsVrsListname匹配的元素,再把这些元素插回原列表。如果初始时possibleValues.getValues()为空,筛选出来的集合就是空,addAll后自然还是空,完全不符合需求。 - 额外问题:即使初始时
possibleValues.getValues()有值,你的写法也会把已有匹配元素重复插入,破坏原始逻辑要求的唯一性,同时每次filter都遍历一次nsVrsList,时间复杂度为O(n*m),性能远低于原始写法。
正确Stream改写方案
首先提取现有元素的name存入Set减少重复遍历,再筛选nsVrsList中需要新增的元素批量插入,和原始逻辑完全等价,性能更优:
// 预收集现有所有name,降低后续查找复杂度 Set<String> existedNames = possibleValues.getValues().stream() .map(MyCustomObject::getName) .collect(Collectors.toSet()); // 筛选需要新增的元素,转换为目标对象后批量添加 possibleValues.getValues().addAll( nsVrsList.stream() .filter(nsVr -> !existedNames.contains(nsVr.getName())) .map(nsVr -> new MyCustomObject(nsVr.getInstance(), nsVr.getInstance(), "")) .collect(Collectors.toList()) );
内容的提问来源于stack exchange,提问作者Alexei
相关产品推荐
相关产品推荐

