含Optional、orElse、Lazy的Java代码解析与简化问题咨询
结论
你的判断完全正确,这段代码的冗余度非常高,属于典型的滥用Optional链式写法导致可读性极差,你提到的两处orElse(false)和第二个方法的返回值确实都没有实际作用,可以直接清理,不会影响现有逻辑。
逻辑拆解&冗余点说明
1. 第一个void方法的orElse(false)完全无用
原代码里的dptCache.map(pubDpt -> removeDiscontinued(pubDpt.keySet(), availableTps)).orElse(false)逻辑等价于:
- 如果
dptCache有值,就调用第二个removeDiscontinued方法 - 否则什么都不做
这里的orElse(false)返回的布尔值没有被任何变量接收、也没有作为判断条件,完全是无效代码。而且用map来执行无返回值消费逻辑本身就是误用,正确的Optional写法应该用ifPresent。
2. 第二个方法里的Optional包装+orElse(false)也是无效代码
这段代码:
Optional.ofNullable(idList).map(trIds -> trIds.removeIf(id -> !availableTps.get().contains(id))).orElse(false);
等价于普通的判空逻辑:
if (idList != null) { idList.removeIf(id -> !availableTps.get().contains(id)); }
removeIf返回的「是否有元素被移除」的布尔值、orElse(false)的返回值都没有被使用,整段Optional链式写法除了降低可读性没有任何作用。
3. 第二个方法的返回值完全没用
这个方法不管内部逻辑执行结果如何,永远返回true,而且第一个方法调用它的时候也完全没有使用这个返回值,这个返回值定义完全是冗余的。
简化后代码(功能100%等价,可读性大幅提升)
private void removeDiscontinued(Optional<Map<String, JSONArrayCache>> dptCache, Lazy<Set<String>> availableTps) { dptCache.ifPresent(pubDpt -> removeDiscontinued(pubDpt.keySet(), availableTps)); } private void removeDiscontinued(Set<String> idList, Lazy<Set<String>> availableTps) { Set<String> available = availableTps.get(); if (available.size() > 0 && idList != null) { idList.removeIf(id -> !available.contains(id)); } }
额外优化了重复调用availableTps.get()的问题,原代码在有数据的时候会重复调用N+1次get(size判断1次,每个元素判断1次),简化后只调用1次,性能更优。
内容的提问来源于stack exchange,提问作者user2917629
相关产品推荐
相关产品推荐

