如何用Lambda与Filter简化Java代码并合并逻辑?
Java代码简化:合并优先取"A"与默认取首元素逻辑
你可以直接将两段逻辑整合到同一个流操作中,无需先收集成List再处理,这里提供几种实用实现方式:
方式一:复用原逻辑合并流操作
这种方式和原逻辑逻辑一致,只是把判断步骤整合到流的收集环节,适合需要保留List后续使用的场景:
final String str = someSao.getResource() .stream() .filter(Resource::isPresentInDB) .map(Resource::getType) .collect(Collectors.collectingAndThen( Collectors.toList(), list -> list.contains("A") ? "A" : list.get(0) ));
方式二:单次遍历流(性能最优)
通过自定义收集器,仅遍历一次流就能完成"优先找A,找不到取首元素"的逻辑,避免不必要的内存开销,适合大数据量场景:
final String str = someSao.getResource() .stream() .filter(Resource::isPresentInDB) .map(Resource::getType) .collect(Collector.of( () -> new Object[]{null, null}, // 数组第一个元素存"A",第二个存遍历到的第一个元素 (acc, type) -> { if (acc[0] == null && "A".equals(type)) { acc[0] = type; } if (acc[1] == null) { acc[1] = type; } }, (acc1, acc2) -> { // 合并时优先保留第一个累加器中的"A",首元素取第一个累加器的结果 acc1[0] = acc1[0] != null ? acc1[0] : acc2[0]; acc1[1] = acc1[1] != null ? acc1[1] : acc2[1]; return acc1; }, acc -> acc[0] != null ? acc[0] : acc[1] ));
注意事项
- 如果处理后的列表为空,上述代码中的
list.get(0)或自定义收集器的acc[1]会返回null,可以根据需求添加兜底逻辑,比如将最后一步改为acc[0] != null ? acc[0] : acc[1] != null ? acc[1] : "默认值",或者使用orElseThrow()抛出指定异常。 - 如果
someSao.getResource()是耗时操作,避免使用两次流的实现方式(会重复调用该方法)。
内容的提问来源于stack exchange,提问作者Saad
相关产品推荐
相关产品推荐

