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

如何使用Java Streams分组列表中成功失败项并按指定格式展示

问题与解决方案

场景说明

现有Result类定义如下:

class Result{
    private String message;
    private boolean success;
    
    // 需补充构造方法与getter以支持后续操作
    public Result(String message, boolean success) {
        this.message = message;
        this.success = success;
    }
    
    public String getMessage() {
        return message;
    }
    
    public boolean isSuccess() {
        return success;
    }
    
    // 自定义toString用于输出展示
    @Override
    public String toString() {
        return "success = " + success + " | message: " + message;
    }
}

查询得到List<Result>集合,示例数据:

Row 1: success = false | message: failed for reason 1.
Row 2: success = true | message: success.
Row 3: success = false | message: failed for reason 2.
Row 4: success = false | message: failed for reason 3.
Row 5: success = true | message: success.

处理需求

  • 所有success=false的记录保留原查询顺序,置于结果顶部
  • 所有success=true的记录合并为单条,显示消息success for the rest.

预期输出:

Row 1: success = false | message: failed for reason 1.
Row 2: success = false | message: failed for reason 2.
Row 3: success = false | message: failed for reason 3.
Row 4: success = true | message: success for the rest.

已尝试代码

已通过流实现按success分组,但不确定后续如何调整顺序与合并成功项:

List<Result> resultSet;
Map<Boolean, List<Result>> result = resultSet.stream().collect(Collectors.groupingBy(Result::isSuccess, Collectors.toList()));

解决方案

基于分组结果,按以下逻辑处理即可实现需求:

  • 提取失败记录并保留原顺序
  • 若存在成功记录,创建一条合并后的成功条目
  • 合并失败列表与合并后的成功条目

完整代码实现:

// 假设resultSet已初始化并填充数据
Map<Boolean, List<Result>> groupedResults = resultSet.stream()
        // 使用LinkedHashMap保证分组后列表保留原元素顺序
        .collect(Collectors.groupingBy(Result::isSuccess, LinkedHashMap::new, Collectors.toList()));

List<Result> finalResultList = new ArrayList<>();

// 添加所有失败记录(无失败记录则添加空列表)
finalResultList.addAll(groupedResults.getOrDefault(false, Collections.emptyList()));

// 仅当存在成功记录时,添加合并后的成功条目
if (groupedResults.containsKey(true) && !groupedResults.get(true).isEmpty()) {
    finalResultList.add(new Result("success for the rest.", true));
}

// 输出处理后的结果
int rowNumber = 1;
for (Result result : finalResultList) {
    System.out.printf("Row %d: %s%n", rowNumber++, result);
}

关键说明

  • 指定LinkedHashMap作为分组容器:默认groupingBy用HashMap不保证顺序,显式使用LinkedHashMap可确保失败记录保留原查询顺序
  • 空值处理:用getOrDefault避免因无失败记录导致的空指针
  • 条件添加成功条目:仅当存在有效成功记录时才添加合并项,避免生成无意义的空成功条目

内容的提问来源于stack exchange,提问作者Pratim Singha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:53:20