Java8 stream toMap、groupingBy、mapping的综合应用

news2024/11/27 14:52:20

文章目录

  • 一、stream toMap、groupingBy、mapping的综合应用
    • 1、前提准备
      • ①、实体类
      • ②、数据准备
    • 2、核心代码:
    • 3、运行结果


一、stream toMap、groupingBy、mapping的综合应用

1、前提准备

①、实体类

package com.cfay.demo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * @author lcb
 * @since 2023-07-19
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Student implements Serializable {

    private Integer id;

    private String name;

    private Integer age;
}

②、数据准备

package com.cfay.demo;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author lcb
 * @since 2023-07-19
 */
public class StudentData {

    private StudentData() {
    }

    public static List<Student> buildStudents() {
        List<Student> students = new ArrayList<>();
        students.add(new Student(1, "小扇", 20));
        students.add(new Student(1, "小雨", 22));
        students.add(new Student(1, "小钰", 19));
        students.add(new Student(1, null, 19));
        students.add(new Student(2, "小蓝", 21));
        students.add(new Student(2, "小天", 20));
        //过滤掉名字为空的数据,并且按照年龄升序排序
        return students.stream().filter(student ->
                Objects.nonNull(student.getName())).sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());
    }
}

2、核心代码:

package com.cfay.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author lcb
 * @since 2023-07-19
 */

public class Test {

    public static void main(String[] args) {
        //将数据按照id进行分组,并把相同id的对象取名称用逗号拼接起来测试
        handleStudentIdNameSplicteMap();
        System.out.println("===================================");
        //将数据按照id进行分组,并把相同id的对象取名称放到集合中去测试
        handleStudentIdNamesMap();
    }

    /**
     * 将数据按照id进行分组,并把相同id的对象取名称用逗号拼接起来
     */
    private static void handleStudentIdNameSplicteMap() {
        //toMap
        System.out.println("toMap ......");
        Map<Integer, String> studentIdNameMap1 = StudentData.buildStudents().stream().collect(Collectors.toMap(Student::getId,
                Student::getName, (pre, act) -> pre + "," + act));
        System.out.println(studentIdNameMap1);

        //groupingBy
        System.out.println("groupingBy ......");
        Map<Integer, String> studentIdNameMap2 = StudentData.buildStudents().stream().collect(Collectors.groupingBy(Student::getId,
                Collectors.mapping(Student::getName, Collectors.joining(","))));
        System.out.println(studentIdNameMap2);
    }

    /**
     * 将数据按照id进行分组,并把相同id的对象取名称放到集合中去
     */
    private static void handleStudentIdNamesMap() {
        //toMap
        System.out.println("toMap ......");
        Map<Integer, List<String>> studentIdNamesMap1 = StudentData.buildStudents().stream().collect(Collectors.toMap(Student::getId, student ->
                new ArrayList<>(Collections.singletonList(student.getName())), (pre, act) -> {
            pre.addAll(act);
            return pre;
        }));
        System.out.println(studentIdNamesMap1);

        //groupingBy
        System.out.println("groupingBy ......");
        Map<Integer, List<String>> studentIdNamesMap2 = StudentData.buildStudents().stream().collect(Collectors.groupingBy(Student::getId,
                Collectors.mapping(Student::getName, Collectors.toList())));
        System.out.println(studentIdNamesMap2);
    }
}

3、运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/769759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LCD拼接屏、LED显示屏和OLED显示屏的主要区别

我们在生活或工作中经常看到大大小小的显示屏&#xff0c;但很多人却分不清楚这些屏到底属于哪一类&#xff0c;今天sostron与大家一起来分享下关于&#xff1a;LCD拼接屏、LED显示屏、OLED透明屏三者的区别。 LCD拼接屏、LED显示屏和OLED显示屏是不同类型的显示技术&#xff0…

【116个】网络安全测试相关面试真题

1、Burpsuite常用的功能是什么&#xff1f; 2、reverse_tcp和bind_tcp的区别&#xff1f; 3、拿到一个待检测的站或给你一个网站&#xff0c;你觉得应该先做什么&#xff1f; 4、你在渗透测试过程中是如何敏感信息收集的&#xff1f; 5、你平时去哪些网站进行学习、挖漏洞提交到…

这样创建客户帮助中心,效果超好!

创建一个有效的客户帮助中心是为了为客户提供优质的支持和服务。在这个数字化时代&#xff0c;客户期望能够快速找到所需的信息&#xff0c;并得到准确和及时的解答。本文将分享创建有效客户帮助中心的最佳实践&#xff0c;帮助您提供出色的客户体验并提升客户满意度。 1. 了解…

Banana Pi M2 Zero 运行 openHAB 回顾

首先我要透露的是&#xff0c;BPI 的工作人员向我发送了一台免费的 BPi M2 Zero 来执行这些测试。我相信我的评论是公平和公正的&#xff0c;但我想坦率地说明这一事实。 硬件简介 与 Raspberry Pi Zero W 相比&#xff0c;Banana Pi BPI-M2 Zero 具有令人印象深刻的规格。以下…

git进阶操作

一、git 基础概念1. 1.1 三种状态&#xff1a; 工作区&#xff08;unstage&#xff09;——已修改&#xff08;modified&#xff09; 暂存区&#xff08;stage&#xff09;——已暂存&#xff08;staged&#xff09; 对象区——已提交&#xff08;commited&#xff09; 工作…

moment.js常见格式化处理各种时间方法

Moment.js 是一个简单易用的轻量级 JavaScript 日期处理类库,提供了日期格式化、日期解析等功能。它支持在浏览器和 NodeJS 两种环境中运行。此类库能够将给定的任意日期转换成多种不同的格式,具有强大的日期计算功能,同时也内置了能显示多样的日期形式的函数。另外,它也支…

博弈论--sg函数

sg函数------ 定义终止状态的SG函数值为0。如果游戏已经结束&#xff0c;即达到了终止状态&#xff0c;那么对应的SG函数值就是0。即先手的sg值为0&#xff0c;则先手必败&#xff0c;否则先手必胜。 如何求sg函数值--------对于每个可能的移动&#xff0c;将后续状态的SG函数…

「从零入门推荐系统」21:chatGPT、大模型介绍

作者 | gongyouliu 编辑 | gongyouliu 自2022年11月30日OpenAI发布chatGPT以来&#xff0c;大模型技术掀起了新一轮人工智能浪潮。chatGPT在各个领域&#xff08;包括对话、摘要、内容生成、问题解答、识图、数学计算与推理、代码编写等&#xff09;取得了比之前算法好得多的成…

测试开发之路 (工具篇)--Docker

目录 前言 什么是 docker 在 demo 中学习 mysql test link 更复杂点的场景 前言 Docker是一种开源的容器化平台&#xff0c;它可以帮助开发人员和测试人员更轻松地构建、部署和运行应用程序。在测试开发中&#xff0c;Docker可以提供许多便利和优势。 什么是 docker 官…

VMware Cloud Director 10.5 - 领先的云服务交付平台

VMware Cloud Director 10.5 - 领先的云服务交付平台 Support for vSphere 8.0U1 & NSX 4.1 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-cloud-director-10/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.or…

【ShenYu系列】ShenYu的SPI实现源码分析

前言 前面我已经介绍【面试系列】详细拆解Java、Spring、Dubbo三者SPI机制的原理&#xff0c;当已经有了合适的实现&#xff0c;shenyu自身的SPI和上面的有啥区别&#xff0c;值得玩味。 什么是SPI SPI就是Service Provider Interface&#xff0c;直译"服务提供方接口&…

go+vue+wails写一个简单的密码加密器

git仓库 gitee: malred/password-generator-wails-vue gitee&#xff1a; malred/password-generator-wails-vue github: https://github.com/malred/password-generator-wails-vue wails是什么 我们用它来套壳前端项目&#xff08;vue&#xff09;&#xff0c;打包成桌面端…

Java虚拟机——类加载机制概述 类加载的时机

在Class文件中描述的各类信息&#xff0c;最终都需要加载到虚拟机中之后才能被运行和使用。本章将会介绍虚拟机如何加载这些Class文件&#xff0c;Class文件中的信息进入到虚拟机后会发生什么变化。类加载机制&#xff1a;Java虚拟机把描述类的数据从Class文件加载到内存&#…

【ArcGIS】shp导入报错ORA-00911无效字符

这个当个问题记录以下&#xff0c;就是shp文件名或者字段名有非正常字符&#xff0c;修改下名称重新导入即可&#xff1b; 直接改shp没法修改字段&#xff0c;会报错&#xff0c;需要先转化为gdb文件&#xff0c;然后在修改

【Spring】Spring AOP入门及实现原理剖析

文章目录 1 初探Aop1.1 何为AOP&#xff1f;1.2 AOP的组成1.2.1 切面(Aspect)1.2.2 连接点(Join Point)1.2.3 切点(Pointcut)1.2.4 通知(Advice) 1.3 AOP的使用场景 2 Spring AOP入门2.1 添加 Spring AOP 框架⽀持2.2 定义切面和切点2.3 定义相关通知 3 Spring AOP实现原理3.1 …

tauri自定义窗口window并实现拖拽和阴影效果

需求说明 由于官方提供的窗口标题并不能实现我的需求&#xff0c;不能很好的实现主题切换的功能&#xff0c;所以根据官方文档实现了一个自定义的窗口&#xff0c;官方文档地址&#xff1a;Window Customization | Tauri Apps 但是实现之后&#xff0c; 没有了窗体拖拽移动的…

linux系统编程-进程

目录 1 程序和进程 1.1 并发 1.3 多道程序设计 1.4 CPU 和 MMU 1.5 进程控制块 PCB 1.6 进程状态 1.7 环境变量 1.8 setenv 函数 2. 进程控制 2.1 fork 函数 2.2 循环创建 n 个子进程 2.3getpid 函数 2.4 getppid 函数 2.5 getuid 函数 2.6 getgid 函数 2.7 进…

分表后mybatis-plus删除操作失效等问题处理

因为重构dao层&#xff0c;问题太多了&#xff0c;于是想着另起一个章节。 3 mybatis封装对象的问题 直接使用mybatis自身的对象&#xff0c;会有问题&#xff0c;他的列表对象会设置一个id&#xff0c;导致后续的工程会出问题 <select id"getStatementDefaultEquation…

基于SpringBoot+vue的银行OA系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

使用Electron包装ruoyi-ui/ruoyi-vue实践总结

背景&#xff1a;最近公司新起的项目&#xff0c;由于工期、资源等原因&#xff0c;采用ruoyi框架快速实现开发&#xff0c;由于需要构建客户端&#xff0c;所以借助electron来实现。 electron 是使用javascript html css来构建跨平台的桌面应用程序。 官网地址&#xff1a;简介…