Java Stream流处理Map 详细用法

2023-11-09

Java Stream流处理Map 详细用法

实体类

package com.jzj.model;

/**
 * 当前描述:
 *
 * @author: jiazijie
 * @since: 2021/7/23 下午4:06
 */
public class Person {
    private Integer id;
    private String name;
    private Integer age;
    private String grade;

    public Person(Integer id, String name, Integer age, String grade) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.grade = grade;
    }

    public String getName() {
        return name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGrade() {
        return grade;
    }

    public void setGrade(String grade) {
        this.grade = grade;
    }
}

Stream方法

package com.jzj.util;

import com.alibaba.fastjson.JSONObject;
import com.xrxs.jzj.model.Person;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.toSet;

/**
 * 当前描述:
 *
 * @author: jiazijie
 * @since: 2021/7/23 下午3:26
 */
public class Test {

    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        Person p1 = new Person(1, "a", 18, "A");
        Person p2 = new Person(2, "b", 19, "B");
        Person p3 = new Person(3, "c", 18, "C");
        Person p4 = new Person(4, "a", 21, "A");
        Person p5 = new Person(5, "a", 18, "B");

        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);

        /**
         * 获取 每个ID对应的 Person Map
         */
        Map<Integer, Person> mapObj = list.stream().collect(Collectors.toMap(Person::getId, Function.identity(), (v1, v2) -> v1));
        // {1:{"age":18,"grade":"A","id":1,"name":"a"},2:{"age":19,"grade":"B","id":2,"name":"b"},3:{"age":18,"grade":"C","id":3,"name":"c"},4:{"age":21,"grade":"A","id":4,"name":"a"},5:{"age":18,"grade":"B","id":5,"name":"a"}}
        System.out.println(JSONObject.toJSONString(mapObj));

        // 获取 每个名字 对应的ID, 如果有重复的名字,就会报错!!!!!Duplicate key 1 比如 a-1,a-4,a-5 这三个同样的名字对应不同的id
        // Map<String, Integer> mapNameId =list.stream().collect(Collectors.toMap(Person::getName,Person::getId));
        // System.out.println(JSONObject.toJSONString(mapNameId));

        /**
         * 为了避免这种情况,要制定 value (v1,v2)->v1 用第一次出现的value还是最后一次出现的value v1 用第一次出现的
         * v2用最后一次出现的
         */
        Map<String, Integer> mapNameId1 = list.stream().collect(Collectors.toMap(Person::getName, Person::getId, (v1, v2) -> v1));
        Map<String, Integer> mapNameId2 = list.stream().collect(Collectors.toMap(Person::getName, Person::getId, (v1, v2) -> v2));
        // {"a":1,"b":2,"c":3}
        System.out.println(JSONObject.toJSONString(mapNameId1));
        // {"a":5,"b":2,"c":3}
        System.out.println(JSONObject.toJSONString(mapNameId2));

        /**
         * 获取 每个班级的 人员集合,以 班级为分组 group
         */
        Map<String, List<Person>> gradePersonsMap = list.stream().collect(Collectors.groupingBy(Person::getGrade));
        // {"A":[{"age":18,"grade":"A","id":1,"name":"a"},{"age":21,"grade":"A","id":4,"name":"a"}],"B":[{"age":19,"grade":"B","id":2,"name":"b"},{"age":18,"grade":"B","id":5,"name":"a"}],"C":[{"age":18,"grade":"C","id":3,"name":"c"}]}
        System.out.println(JSONObject.toJSONString(gradePersonsMap));

        /**
         * 获取 每个班级的 人员年龄的Set集合 以班级为分组,年龄去重
         */
        Map<String, Set<Integer>> gradeAgesMap = list.stream()
                .collect(Collectors.groupingBy(Person::getGrade, Collectors.mapping(Person::getAge, Collectors.toSet())));
        // {"A":[18,21],"B":[18,19],"C":[18]}
        System.out.println(JSONObject.toJSONString(gradeAgesMap));

        /**
         * 获取 每个班级的 人员ID的List集合 以班级为分组,人员ID
         */
        Map<String, List<Integer>> gradePIdListMap = list.stream()
                .collect(Collectors.groupingBy(Person::getGrade, Collectors.mapping(Person::getId, Collectors.toList())));
        // {"A":[1,4],"B":[2,5],"C":[3]}
        System.out.println(JSONObject.toJSONString(gradePIdListMap));

        /**
         * 获取 每个班级的 人员集合,以 班级为分组 group
         */
        Map<String, List<Person>> gradePersons = list.stream().collect(Collectors.groupingBy(Person::getGrade));

         以Map开始遍历 获取班级 中年龄的 去重集合
        Map<String, Set<Integer>> gradeAgeSetMap = gradePersons.entrySet().stream().collect(
                Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().stream().map(Person::getAge).collect(toSet()), (v1, v2) -> v1));
        // {"A":[18,21],"B":[18,19],"C":[18]}
        System.out.println(JsonUtil.toJson(gradeAgeSetMap));
    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Stream流处理Map 详细用法 的相关文章

随机推荐

  • Linux:C语言实现面向接口编程

    在Linux环境下 实现面向接口编程可以使用C语言中的函数指针来实现 具体步骤如下 定义接口 定义一个接口 包含一组函数指针 这些函数指针代表了该接口的方法 例如 我们可以定义一个名为 Interface 的接口 cCopy code ty
  • flow对性能的影响

    不同高中低端ROUTER 其netflow处理性能果然相差很大低端10000f s是极限 中端40000f s 高端60000f s 且还有simpled这个杀手锏 低端ROUTER 2600 2800 3600 3700 来说 采集100
  • 使用Python爬取前程无忧上南京地区Python职位以及对应工资

    获取原始数据 最近在学习Python 做了一个爬虫程序练练手 前程无忧这个网站页面布局还是挺简单的 适合我这种新手 使用requests bs4爬取 不多说了 先来看看页面布局吧 这是前程无忧上的职位列表 看上去还是很清楚的 然后再来看看页
  • systemctl start network 启动网卡服务报错解决方法

    systemctl start network 启动网卡服务报错 root apache systemctl restart network Job for network service failed because the contro
  • Hibernate之查询中get()和load()的区别,list()和iterate()的区别

    Hibernate 之查询中get 和load 的区别 list 和iterate 的区别 list 查询 一次性把数据对象取出来 Test public void findTestList Session s sessionFactory
  • python3 面试题总结

    Python global 语句的作用 lambda 匿名函数好处 Python 错误处理 Python 内置错误类型 简述 any 和 all 方法 Python 中什么元素为假 提高 Python 运行效率的方法 Python 单例模式
  • LeetCode63. 不同路径 II

    不同路径 II 一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 Start 机器人每次只能向下或者向右移动一步 机器人试图达到网格的右下角 在下图中标记为 Finish 现在考虑网格中有障碍物 那么从左上角到右下角将会有
  • Halcon三维模型预处理(1):调平的三大手法

    面结构光拍摄生成的点云模型 往往相对系统坐标系是有角度的 首先讲一下调平的目的 1 为接下来的预处理切除背景面做准备 3 不做调平 后续处理会很麻烦 因为不清楚坐标系在平台的为位置 2 对于无序抓取项目 平台相对相机可能是有角度的 将抓取平
  • socket和mongodb

    socket 创建一个socket 然后连接server url net Socket 发送信息给服务器 socket通信 client可以进行数据的编写和发送 服务器 只有一个 只有开启了服务器 客户端才能进行连接 mongodb 关系型
  • 归并排序(简单易懂的代码)

    归并排序是一种很重要的排序算法 体现的是分而治之的思想 很多的算法题的解法会借用这种算法思想 在这里使用C 编程实现归并排序 供自己回忆 供他人参考 include
  • 单元测试--重构

    一 单元测试 1 在没写函数内容代码前 就要写单元测试类 每个测试类中有TestSuite 2 如果写单元测试很困难 那么可能是你对要测试的函数不是很了解 如果不是则可能是设计的问题 也许要重构 二 重构1 不要存在代码重复的现象 若有 且
  • Android-布局管理器

    线性布局 Linearlayout 属性 orientation 布局管理器内组件的排列方式 horizontal 水平 和vertical 垂直 默认值为 horizontal layout weight 权重 用于设置组件占父容器剩余空
  • 网易云音乐播放器部分问题集

    这周在做网易云音乐播放器 这期间遇到了不少问题 下面就来记录一下我所遇到的部分问题 一 接口问题 调用网易云的接口 网上一搜方法一大堆 但是我的理解有些问题 硬生生搞了好久 下面就给那个方法再重新小白化一遍TAT 安装环境 首先你要有nod
  • FastAPI Web框架 [Pydantic]

    学习一下 做个记录 Starlette Pydantic 与 FastAPI 的关系 Python 的类型提示 type hints Pydantic 是一个基于 Python 类型提示来定义数据验证 序列化和文档 使用JSON 模式 库
  • 基于Arduino IDE 和ESP32-CAM 制作远程摄像头

    说明 具体教程及详细步骤参考 arduino esp32 cam环境配置和例程使用 在这里仅仅针对个人在开发过程中的一点经验及上文帖子没提到的一些部分做一个总结 因为我当初根据这个教程做的时候有以下几点是导致我一开始浪费了大量时间精力的 特
  • redis设计与实现读书笔记-主从复制

    主从复制 在Redis中 用户可以通过执行SLAVEOF命令或者设置slaveof选项 让一个服务器去复制 replicate 另一个服务器 我们称呼被复制的服务器为主服务器 master 而对主服务器进行复制的服务器则被称为从服务器 sl
  • git使用X篇_2_Git全套教程IDEA版(git、GitHub、Gitee码云、搭建公司内部GitLab、与IDEA集成等内容)

    本文是根据以下视频及网上总结进行更新后的介绍git使用的博文 包含了git GitHub Gitee码云 搭建公司内部GitLab 与IDEA集成等内容 笔记来源 尚硅谷 5h打通Git全套教程IDEA版 涵盖GitHub Gitee码云
  • 初识docker之如何运行一个容器

    手把手运行一个镜像 1 容器的特点2 启动容器的参数3 docker run d it name test p 900 8080 v opt usr local 78b258e36eed d 后台执行容器 it 保持stdin和为容器创建t
  • 一文搞懂Redis架构演化之路

    你好 我是 Kaito 这篇文章我想和你聊一聊 Redis 的架构演化之路 现如今 Redis 变得越来越流行 几乎在很多项目中都要被用到 不知道你在使用 Redis 时 有没有思考过 Redis 到底是如何稳定 高性能地提供服务的 我使用
  • Java Stream流处理Map 详细用法

    文章目录 Java Stream流处理Map 详细用法 实体类 Stream方法 Java Stream流处理Map 详细用法 实体类 package com jzj model 当前描述 author jiazijie since 202