如何使用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
相关产品推荐
相关产品推荐

