Java8 新特性 list集合利用stream根据对象得某一属性对集合进行分组,附加8之前分组

简介: Java8 新特性 list集合利用stream根据对象得某一属性对集合进行分组,附加8之前分组

Java8 新特性 list集合利用stream根据对象得某一属性对集合进行分组,附加8之前分组


Java8之后很多新特性,接下来主要讲一下, list集合利用stream根据对象得某一属性对集合进行分组!

话不多说,上代码:

首先准备实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private Integer id;
    private String name;
  //成绩
    private Double score;
}

然后开始写测试类:

import java.util.*;
import java.util.stream.Collectors;
public class GroupByName {
    public static void main(String[] args) {
        //准备要分组得集合
        List<Student> students = Arrays.asList(
            new Student(1,"伽罗",99d),
            new Student(2,"后羿",97d),
            new Student(3,"鲁班",98d),
            new Student(4,"后羿",90d),
            new Student(5,"百里",88d),
            new Student(6,"狼狗",59d),
            new Student(7,"艾琳",78d),
            new Student(8,"伽罗",94d)
        );
        //jdk8.0新特性来分组,根据学生姓名来进行分组
        Map<String,List<Student>> result = new HashMap<>();
        result = students.stream().collect(Collectors.groupingBy(Student::getName));
        result.forEach((x,y) -> System.out.println(x+"--"+y));
        System.out.println("华丽分割线"+"------------------------");
        //jdk1.8之前手写分组
        Map<String,List<Student>> map = new HashMap<>();
        for (Student student : students) {
            List<Student> list = map.get(student.getName());
            if (list == null) {
                list = new ArrayList<>();
                list.add(student);
                map.put(student.getName(), list);
            } else {
                list.add(student);
            }
        }
        map.forEach((x,y) -> System.out.println(x+"--"+y));
        /**
         * 结果:
         * 伽罗--[Student(id=1, name=伽罗, score=99.0), Student(id=8, name=伽罗, score=94.0)]
         * 百里--[Student(id=5, name=百里, score=88.0)]
         * 狼狗--[Student(id=6, name=狼狗, score=59.0)]
         * 艾琳--[Student(id=7, name=艾琳, score=78.0)]
         * 后羿--[Student(id=2, name=后羿, score=97.0), Student(id=4, name=后羿, score=90.0)]
         * 鲁班--[Student(id=3, name=鲁班, score=98.0)]
         */
    }
}

到这里新特性分组就介绍完了,列子简单,直接上手简单,谢谢大家支持!!

相关文章
|
19天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
23天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
43 17
|
22天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
22天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
21 0
|
IDE Java 关系型数据库
Java14发布,16大新特性,代码更加简洁明快
Java14发布,16大新特性,代码更加简洁明快
321 0
Java14发布,16大新特性,代码更加简洁明快
|
10天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
19天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
6天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
27 9
|
9天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
|
6天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin