如何使用Streams重写带标签的嵌套循环代码?是否有更优雅实现?
嵌套循环跳出替代方案
你的需求仅需要校验首个
Units对象的首个UnitLine对象即可确定类型,不需要完整遍历集合,因此完全可以避免嵌套循环+标签的写法,以下是几种更简洁的实现方案:
方案1:直接取首元素实现(最高效直观)
不需要用到循环,直接取集合首元素做判断,同时补全空安全逻辑即可:
// 提前校验边界避免空指针 if (units != null && !units.isEmpty()) { Units firstUnit = units.get(0); List<UnitLine> unitLines = firstUnit.getUnitLines(); if (unitLines != null && !unitLines.isEmpty()) { UnitLine firstLine = unitLines.get(0); List<String> lookupResults = findLookup(LOOKUP_CODE, firstLine.getCode()); someObject.setType((lookupResults != null && !lookupResults.isEmpty()) ? TYPE1 : TYPE2); } else { // 无unitLine时按业务需求给默认值,示例默认给TYPE2 someObject.setType(TYPE2); } } else { // units为空时按业务需求给默认值,示例默认给TYPE2 someObject.setType(TYPE2); }
方案2:Optional链式调用(空安全更简洁)
Java 8+ 可以用Optional简化多层空判断,代码更紧凑:
someObject.setType( Optional.ofNullable(units) .filter(list -> !list.isEmpty()) .map(list -> list.get(0)) .map(Units::getUnitLines) .filter(lines -> lines != null && !lines.isEmpty()) .map(lines -> lines.get(0)) .map(line -> findLookup(LOOKUP_CODE, line.getCode())) .filter(results -> results != null && !results.isEmpty()) .map(results -> TYPE1) .orElse(TYPE2) );
方案3:Stream API实现
如果后续可能需要扩展为遍历所有元素的逻辑,可以直接用Stream实现:
boolean hasValidLookup = units.stream() .findFirst() // 取第一个unit .map(Units::getUnitLines) .stream() .flatMap(Collection::stream) .findFirst() // 取第一个unitLine .map(line -> findLookup(LOOKUP_CODE, line.getCode())) .filter(results -> results != null && !results.isEmpty()) .isPresent(); someObject.setType(hasValidLookup ? TYPE1 : TYPE2);
补充说明
你原代码中存在一处笔误:内层循环的集合来源写成了unitLine.getUnitLines(),实际应该是外层循环变量unit.getUnitLines()。
内容的提问来源于stack exchange,提问作者vviston
相关产品推荐
相关产品推荐

