You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一条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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:24:58