Java 8 Collectors 深入解析与示例

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: 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中一些常用收集器的简介和示例。通过这些收集器,我们可以非常方便地对数据流进行转换、聚合、分组等操作,极大地提高了代码的简洁性和可读性。在实际开发中,合理利用这些工具能够有效提升编程效率。

相关文章
|
2月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
362 5
|
2月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
2月前
|
存储 安全 Java
《数据之美》:Java集合框架全景解析
Java集合框架是数据管理的核心工具,涵盖List、Set、Map等体系,提供丰富接口与实现类,支持高效的数据操作与算法处理。
|
3月前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
445 3
|
3月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
3月前
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
416 0
|
3月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
449 100
|
3月前
|
机器学习/深度学习 JSON Java
Java调用Python的5种实用方案:从简单到进阶的全场景解析
在机器学习与大数据融合背景下,Java与Python协同开发成为企业常见需求。本文通过真实案例解析5种主流调用方案,涵盖脚本调用到微服务架构,助力开发者根据业务场景选择最优方案,提升开发效率与系统性能。
811 0
|
3月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
435 1

推荐镜像

更多
  • DNS