Java 8 Collectors 深入解析与示例

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Java 8 Collectors 深入解析与示例

Java 8中,java.util.stream.Collectors类提供了强大的数据流处理和归约操作,使得对集合的操作更加简洁高效。本文将通过创建一个简单的Student类为例,来逐一介绍Collectors中常用的收集器及其使用方法。

首先,定义一个Student类:

public class Student {
    private String name;
    private int age;
    private double score;

    // 构造方法、getter和setter省略...
}

接下来,我们将使用这个Student类作为示例,探索各种收集器的应用场景。

基础收集器

toList()

将流转换为List

List<Student> students = ... // 学生列表
List<Student> studentList = students.stream().collect(Collectors.toList());

toSet()

将流转换为Set,自动去重。

Set<Student> studentSet = students.stream().collect(Collectors.toSet());

joining()

将流中的元素连接成一个字符串

String names = students.stream()
                        .map(Student::getName)
                        .collect(Collectors.joining(", "));

counting()

统计流中元素的数量。

long count = students.stream().collect(Collectors.counting());

minBy() / maxBy()

找到流中最小/最大的元素。

Optional<Student> youngest = students.stream()
                                    .collect(Collectors.minBy(Comparator.comparingInt(Student::getAge)));

Optional<Student> oldest = students.stream()
                                  .collect(Collectors.maxBy(Comparator.comparingInt(Student::getAge)));


summingInt(), summingLong(), summingDouble()

对流中元素的某个数值属性求和。

double totalScore = students.stream()
                            .collect(Collectors.summingDouble(Student::getScore));

averagingInt(), averagingLong(), averagingDouble()

计算流中元素的某个数值属性的平均值。

double averageScore = students.stream()
                              .collect(Collectors.averagingDouble(Student::getScore));

reducing()

通用的归约操作,可以实现求和、求积等多种操作。

// 求所有学生成绩之和
double sumScores = students.stream()
                           .collect(Collectors.reducing(0.0, Student::getScore, Double::sum));

分组收集器

groupingBy()

根据某个属性进行分组。

Map<Integer, List<Student>> studentsByAge = students.stream()
                                                    .collect(Collectors.groupingBy(Student::getAge));

partitioningBy()

根据条件进行分区。

Map<Boolean, List<Student>> studentsByAgePartition = students.stream()
                                                             .collect(Collectors.partitioningBy(s -> s.getAge() > 18));

映射收集器

mapping()

在收集前对元素进行转换。

List<String> names = students.stream()
                             .collect(Collectors.mapping(Student::getName, Collectors.toList()));

collectingAndThen()

先应用一个收集器,再应用一个最终转换函数。

Optional<Double> maxScore = students.stream()
                                    .collect(Collectors.collectingAndThen(
                                        Collectors.maxBy(Comparator.comparingDouble(Student::getScore)),
                                        opt -> opt.map(Student::getScore).orElse(0.0)));

以上是Collectors中一些常用收集器的简介和示例。通过这些收集器,我们可以非常方便地对数据流进行转换、聚合、分组等操作,极大地提高了代码的简洁性和可读性。在实际开发中,合理利用这些工具能够有效提升编程效率。

目录
相关文章
|
1天前
|
Java 程序员 编译器
Java内存模型深度解析与实践优化策略
在多线程编程领域,Java内存模型(Java Memory Model, JMM)是确保并发程序正确性的基石。本文深入探讨JMM的工作原理,结合最新研究成果和实际案例,揭示高效同步策略和避免常见并发缺陷的方法。文章不仅阐述理论,更注重实践,旨在为Java开发者提供全面的内存模型应用指南。
|
1天前
|
存储 算法 Java
性能优化:Java垃圾回收机制深度解析 - 让你的应用飞起来!
Java垃圾回收自动管理内存,防止泄漏,提升性能。GC分为标记-清除、复制、标记-整理和分代收集等算法。JVM内存分为堆、方法区等区域。常见垃圾回收器有Serial、Parallel、CMS和G1。调优涉及选择合适的GC、调整内存大小和使用参数。了解和优化GC能提升应用性能。
11 3
|
1天前
|
IDE Java 编译器
深入解析JAVA注解:元数据如何改变编程世界
【6月更文挑战第29天】Java注解,作为元数据机制,为代码增添上下文信息,改变编程方式。注解标记在类、方法等上,不直接影响执行,但为编译器等提供额外信息。分为元注解、编译时和运行时注解,用于元数据提供、代码简化、提高可读性及自动化。示例展示了定义`@Loggable`注解来标记日志记录方法。注解广泛应用于依赖注入、ORM、Web服务等,提升效率和灵活性,是现代Java开发的关键。未来其应用将更广泛。
12 3
|
1天前
|
Java
static关键字在Java中的应用场景与示例
static关键字在Java中的应用场景与示例
|
安全 JavaScript 前端开发
java基础示例
这篇文章将为大家详细讲解有关java基础之方法的示例分析
|
2天前
|
安全 算法 Java
java多线程面试题2019整理
java多线程面试题2019整理
|
1天前
|
Java 数据处理 调度
Java多线程编程入门指南
Java多线程编程入门指南
|
2天前
|
监控 安全 算法
如何有效地处理Java中的多线程
如何有效地处理Java中的多线程
|
2天前
|
Java 调度
Java多线程编程与并发控制策略
Java多线程编程与并发控制策略
|
2天前
|
安全 Java 开发者
Java并发编程:理解并发与多线程
在当今软件开发领域,Java作为一种广泛应用的编程语言,其并发编程能力显得尤为重要。本文将深入探讨Java中的并发编程概念,包括多线程基础、线程安全、并发工具类等内容,帮助开发者更好地理解和应用Java中的并发特性。
6 1

推荐镜像

更多