Java合并两个流操作以提升性能:单流实现方案问询
单流操作优化列表元素更新逻辑
自定义类定义
class A { int count; String name; // 假设存在对应构造方法、getter和setter public A(int count, String name) { this.count = count; this.name = name; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public String getName() { return name; } }
列表初始化代码
List<A> aList = new ArrayList<>(); A a = new A(1,"abc"); A b = new A(0,"def"); A c = new A(0,"xyz"); aList.add(a); aList.add(b); aList.add(c);
业务需求
- 将列表所有元素的
count字段设为0 - 把
name字段匹配指定值(忽略大小写)的元素count设为1
现有实现(两次流遍历)
String tempName = "Some Name like abc/def/xyz"; aList.stream().forEach(x -> x.setCount(0)); aList.stream().filter(x -> x.getName().equalsIgnoreCase(tempName)) .findFirst() .ifPresent(y -> y.setCount(1));
单流优化方案
通过一次遍历完成所有逻辑,替代两次流操作:
简洁写法(三元表达式)
String tempName = "Some Name like abc/def/xyz"; aList.stream().forEach(item -> item.setCount(tempName.equalsIgnoreCase(item.getName()) ? 1 : 0) );
清晰分支写法
String tempName = "Some Name like abc/def/xyz"; aList.stream().forEach(item -> { if (tempName.equalsIgnoreCase(item.getName())) { item.setCount(1); } else { item.setCount(0); } });
说明
原逻辑先统一设0再修改匹配项,和直接判断元素是否匹配、匹配设1不匹配设0的结果完全一致。单流操作只需遍历列表一次,避免了两次遍历的性能开销,同时代码更简洁。
内容的提问来源于stack exchange,提问作者Som
相关产品推荐
相关产品推荐

