如何在同一条Java Stream中使用多过滤+Map操作并合并为单行号列表?
合并为单个Stream的实现方案
你可以直接通过一次流遍历完成所有操作,无需拆分两次流再拼接,具体实现如下:
List<Integer> rowNumbers = errors.stream() .filter(error -> error instanceof Type1Error || error instanceof Type2Error) .map(error -> { if (error instanceof Type1Error) { return ((Type1Error) error).getRowNumber(); } else { return ((Type2Error) error).getRowNumber(); } }) .collect(Collectors.toList());
更优雅的优化方式
如果能让Type1Error和Type2Error实现同一个包含getRowNumber()方法的接口(比如命名为RowNumberAware),代码会更简洁:
// 定义统一接口 interface RowNumberAware { int getRowNumber(); } // 让两个错误类实现该接口 class Type1Error implements RowNumberAware { // 实现getRowNumber方法 } class Type2Error implements RowNumberAware { // 实现getRowNumber方法 } // 简化后的流操作 List<Integer> rowNumbers = errors.stream() .filter(RowNumberAware.class::isInstance) .map(RowNumberAware.class::cast) .map(RowNumberAware::getRowNumber) .collect(Collectors.toList());
这种方式不仅避免了多次遍历errors集合,还提升了代码的扩展性——后续新增类似的错误类时,只需实现接口即可,无需修改流操作逻辑。
内容的提问来源于stack exchange,提问作者krenkz
相关产品推荐
相关产品推荐

