Java Streams:将分组结果映射为自定义对象列表

浅涛大大_1596

浅涛大大_1596

2026-01-11

227人浏览

原创

Java Streams:将分组结果映射为自定义对象列表

本文介绍如何使用 java stream api 将按字段分组的列表(如 `list`)高效转换为固定结构的自定义对象列表(如 `list`),并安全处理不等长分组(自动补 `null`)。

在实际开发中,常需将扁平数据按某字段(如 value)聚合并展开为结构化对象。例如,给定 PivotMapEgModel 列表,目标是生成 List,其中每个 ResultSet 包含 value 及最多三个 code 字段(code_1、code_2、code_3),不足则补 null。

核心思路分为三步:

  1. 分组聚合:用 Collectors.groupingBy 按 getValue() 分组,并用 Collectors.mapping 提取所有 getCode() 值为 List;
  2. 转换条目:对分组结果的 entrySet() 流式遍历,将每个 (key, List) 映射为 ResultSet;
  3. 安全取值:通过辅助方法 getCode(list, index) 防止 IndexOutOfBoundsException,索引越界时返回 null。

以下是完整可运行示例:

Java Development Man
Java Development Man

Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。

下载
import java.util.*;
import java.util.stream.Collectors;

@Data
@AllArgsConstructor
class ResultSet {
    long value;
    String code_1;
    String code_2;
    String code_3;
}

class PivotMapEgModel {
    private final long value;
    private final String code;

    PivotMapEgModel(long value, String code) {
        this.value = value;
        this.code = code;
    }

    long getValue() { return value; }
    String getCode() { return code; }
}

// 主逻辑
public class StreamToCustomObject {
    public static void main(String[] args) {
        List<pivotmapegmodel> pivotMapList = List.of(
            new PivotMapEgModel(1L, "1"),
            new PivotMapEgModel(1L, "2"),
            new PivotMapEgModel(1L, "3"),
            new PivotMapEgModel(2L, "5")
        );

        List<resultset> result = pivotMapList.stream()
            .collect(Collectors.groupingBy(
                PivotMapEgModel::getValue,
                Collectors.mapping(PivotMapEgModel::getCode, Collectors.toList())
            ))
            .entrySet()
            .stream()
            .map(entry -> new ResultSet(
                entry.getKey(),
                getCode(entry.getValue(), 0),
                getCode(entry.getValue(), 1),
                getCode(entry.getValue(), 2)
            ))
            .collect(Collectors.toList());

        System.out.println(result);
        // 输出: [ResultSet(value=1, code_1=1, code_2=2, code_3=3), 
        //        ResultSet(value=2, code_1=5, code_2=null, code_3=null)]
    }

    private static String getCode(List<string> codes, int index) {
        return index <p>✅ <strong>关键注意事项</strong>:  </p>
<ul>
<li>分组后直接操作 entrySet().stream() 是连接聚合与构造的关键桥梁;  </li>
<li>避免在 map() 中硬编码 list.get(i),必须封装边界检查,否则流式处理会因单个异常而中断整个流水线;  </li>
<li>若业务允许,也可用 Optional.ofNullable(...).orElse(null) 等方式增强可读性,但本例中自定义 getCode 更简洁高效;  </li>
<li>此方案时间复杂度为 O(n),仅一次遍历 + 一次分组后遍历,性能优秀且语义清晰。</li>
</ul>
<p>该模式适用于任何“分组 → 展开为固定宽表”的场景,是 Java Stream 进阶应用的典型范式。</p></string></resultset></pivotmapegmodel>

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7579

3

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

569

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1698

6

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

750

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

343

7

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.17

553

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

323

6

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

2026.11.12

100

15

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

2026.11.12

60

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习