Java流式操作——Collectors工具类

这篇具有很好参考价值的文章主要介绍了Java流式操作——Collectors工具类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

Java中的Collectors工具类是用于收集流中的元素并生成结果的工具类。它提供了一系列静态方法,可以用于对流进行归约、分组、分区、转换等操作。
Java流式操作——Collectors工具类

方法

● maxBy:获取流中最大元素;minBy:获取流中最小元素
● joining:合并,将流中的元素,以字符串的形式拼接起来
● summingInt:把流中的元素映射成int类型的元素,求和
● averagingInt:把流中的元素映射成int类型的元素,求平均值
● summarizingInt:把流中的元素映射成int类型的元素,获取描述信息


以上的方法我们都可以通过Stream的collect()方法来使用,例如:

List<String> list = Arrays.asList("apple", "banana", "orange");
List<String> collectedList = list.stream()
                                .filter(s -> s.length() > 5)
                                .collect(Collectors.toList());

Map<String, Integer> map = list.stream()
                                .collect(Collectors.toMap(Function.identity(), String::length));

String joinedString = list.stream()
                            .collect(Collectors.joining(", "));

通过toList()方法将流中的元素收集到一个List集合中,通过toMap()方法将流中的元素收集到一个Map集合中,通过joining()方法将流中的元素连接成一个字符串。

实践说明

一、前提条件

Person类

package com.example;

import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.context.annotation.Configuration;

import java.util.Objects;

/**
 * @BelongsProject: StreamOperate
 * @BelongsPackage: com.example
 * @CreateTime: 2023-05-01  11:18
 * @Description: Person实体类
 * @Version: 1.0
 */
public class Person implements Comparable<Person>{
    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public Person setAge(int age) {
        this.age = age;
        return this;
    }

    public int getScore() {
        return score;
    }

    public Person setScore(int score) {
        this.score = score;
        return this;
    }

    private String name;
    private int age;
    private int score;


    public Person(String name, int age, int score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }

    public Person() {

    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        //地址相同,为true
        if (this == o) return true;
        //为null,并且类型不一样,为false
        if (o == null || getClass() != o.getClass()) return false;
        //向下转型,再去比较属性值
        Person person = (Person) o;
        //如果属性值相同,最后的结果为true
        return age == person.age && score == person.score && Objects.equals(name, person.name);


        //return false;
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, score);
    }


    @Override
    public int compareTo(Person o) {
        return this.getScore()-o.getScore();
    }
}

Data类

package com.example;

import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;

/**
 * @BelongsProject: StreamOperate
 * @BelongsPackage: com.example
 * @CreateTime: 2023-05-01  11:08
 * @Description: Data类
 * @Version: 1.0
 */
public class Data {
    public static ArrayList<Person> getData() {
        ArrayList<Person> personList = new ArrayList<>();

        personList.add(new Person("张三", 18, 90));
        personList.add(new Person("李四", 19, 100));
        personList.add(new Person("王五", 17, 60));
        personList.add(new Person("赵六", 18, 89));
        personList.add(new Person("孙七", 20, 96));
        personList.add(new Person("郑十", 20, 46));
        personList.add(new Person("周八", 20, 96));
        personList.add(new Person("周八", 20, 96));
        personList.add(new Person("吴九", 20, 45));
        personList.add(new Person("邓十一", 20, 35));
        personList.add(new Person("刘十二", 20, 99));
        personList.add(new Person("小十三", 20, 56));
        personList.add(new Person("小十三", 20, 56));

        return personList;
    }
}

二、操作

转换类型

toList():将流中的元素收集到一个List集合中。
List<Integer> numbers = Stream.of(1, 2, 3, 4, 5)
        .collect(Collectors.toList());
toSet():将流中的元素收集到一个Set集合中。
Set<String> names = Stream.of("Alice", "Bob", "Charlie")
        .collect(Collectors.toSet());
toMap():将流中的元素收集到一个Map集合中,可以指定键和值的提取方式。
Map<String, Integer> scores = Stream.of("Alice", "Bob", "Charlie")
        .collect(Collectors.toMap(name -> name, name -> name.length()));

maxBy:获取流中最大元素;minBy:获取流中最小元素

public static void main(String[] args) {
        Stream<Person> stream = Data.getData().stream();

        //maxBy:获取流中最大元素;minBy:获取流中最小元素
        System.out.println(Data.getData().stream().collect(Collectors.maxBy((ele1, ele2) -> ele1.getScore() - ele2.getScore())));
        System.out.println(Data.getData().stream().collect(Collectors.minBy((ele1, ele2) -> ele1.getAge() - ele2.getAge())));
}

counting():统计流中元素的个数。

long count = Stream.of(1, 2, 3, 4, 5)
        .collect(Collectors.counting());

partitioningBy():根据指定的条件将流中的元素进行分区。

Map<Boolean, List<Integer>> partition = Stream.of(1, 2, 3, 4, 5)
        .collect(Collectors.partitioningBy(num -> num % 2 == 0));

joining:合并,将流中的元素,以字符串的形式拼接起来

public static void main(String[] args) {
        Stream<Person> stream = Data.getData().stream();

        //joining:合并,将流中的元素,以字符串的形式拼接起来
        //将集合中person对象的姓名拼接成一个字符串
        System.out.println(Data.getData().stream().map(Person::getName).collect(Collectors.joining()));
        System.out.println(Data.getData().stream().map(Person::getName).collect(Collectors.joining("-")));
        System.out.println(Data.getData().stream().map(Person::getName).collect(Collectors.joining("-", "{", "}")));
}


summingInt:把流中的元素映射成int类型的元素,求和

public static void main(String[] args) {
        Stream<Person> stream = Data.getData().stream();
				
				//summingInt:把流中的元素映射成int类型的元素,求和
        System.out.println(Data.getData().stream().collect(Collectors.summingInt(Person::getScore)));
}


averagingInt:把流中的元素映射成int类型的元素,求平均值

public static void main(String[] args) {
        Stream<Person> stream = Data.getData().stream();

        //averagingInt:把流中的元素映射成int类型的元素,求平均值
        System.out.println(Data.getData().stream().collect(Collectors.averagingInt(Person::getScore)));
}


summarizingInt:把流中的元素映射成int类型的元素,获取描述信息

需求:将流中分数大于等于80的Person对象替换成他们的姓名

 public static void main(String[] args) {
        Stream<Person> stream = Data.getData().stream();
      
        //summarizingInt:把流中的元素映射成int类型的元素,获取描述信息
        IntSummaryStatistics collect = Data.getData().stream().collect(Collectors.summarizingInt(Person::getScore));
        System.out.println(collect);
        System.out.println(collect.getCount());
        System.out.println(collect.getSum());
        System.out.println(collect.getMax());
        System.out.println(collect.getMax());
        System.out.println(collect.getAverage());

输出结果:
Java流式操作——Collectors工具类


Collectors工具类提供了丰富的功能,可以方便地对流进行各种操作和处理,简化了代码的编写。需要注意的是,Collectors工具类是在Java 8中引入的,需要使用Java 8及以上版本才能使用。


如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞+收藏+评论脚印支持一下博主~文章来源地址https://www.toymoban.com/news/detail-432271.html

到了这里,关于Java流式操作——Collectors工具类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 8:Stream API 流式操作(学习)

    Java 8 中的 Stream API 是一组用于对集合数据进行处理的新特性;提供一种以声明式风格对集合进行操作的方式,简化集合的处理,使得代码更加简洁、优雅,并且能够更高效地处理数据; 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进

    2024年02月10日
    浏览(41)
  • Java8 Collectors类详解(一)

      Collectors 类是用于对流进行收集和汇总的工具类。它提供了许多方法来对流进行分组、统计、转换、分区、连接、归约等操作,使得处理集合类数据变得更加方便。         在使用 Collectors 类时,我们可以通过调用其中的方法来实现对流的不同处理方式。例如,将流中

    2024年02月07日
    浏览(52)
  • 【Java基础】Stream 流中 Collectors.toMap 的用法

    Collectors.toMap() 方法是把 List 转 Map 的操作 1.1、如果不是对象,是数组,怎么转成map? 按照规范来写的话,最好所有toMap,都要将这个异常提前考虑进去,不然有时候会报重复主键异常,这也是正例的写法,上面的属于反例的写法。 2.1、Collectors.toMap 有三个重载方法:  参数解

    2024年02月14日
    浏览(44)
  • Java解决stream流Collectors.groupingBy 分组统计可能报空指针异常

    在使用stream流的Collectors.groupingBy做分组统计时(示例代码如下) 如果统计的字段userName有null值则会报如下错误 解决方法为在统计之前增加一个filter方法将null值事先过滤掉。代码如下:

    2024年02月04日
    浏览(57)
  • java8 Stream流Collectors.toMap当value为null时报空指针异常(NPE)

    一、问题 在项目测试过程中发现当使用下面这种方法后报空指针异常(NPE): 按理说 HashMap 的 key 和 value 都是可以为 null 的,不应该报 NPE 啊,经过定位分析发现 Map 中有个键值对的 value 为 null 值,在调用 Collectors.toMap 时报了 NullPointerException 。 二、分析 Collectors.toMap 的

    2024年02月15日
    浏览(43)
  • Java Stream 处理分组后取每组最大&Stream流之list转map、分组取每组第一条&Java 8 Collectors:reducing 示例(List分组取最值)

    有一个需求功能:先按照某一字段分组,再按照另外字段获取最大的那个 先根据appId分组,然后根据versionSort取最大. JDK1.8推出的stream流能极大的简化对集合的操作,让代码更美观,老规矩,直接上代码。 取list中对象的某个属性作为唯一key,对象作为value形成一个map集合,能

    2024年02月16日
    浏览(57)
  • JDK8新特性(一)集合之 Stream 流式操作

           首先我们应该知道:Stream流的出现,主要是用在集合的操作上。在我们日常的工作中,经常需要对集合中的元素进行相关操作。诸如:增加、删除、获取元素、遍历。         最典型的就是集合遍历了。接下来我们先举个例子来看看 JDK8 Stream流式操作出现之前,

    2024年01月23日
    浏览(35)
  • Java中的并发工具类

    JUC篇:volatile可见性的实现原理 JUC篇:synchronized的应用和实现原理 JUC篇:用Java实现一个简单的线程池 JUC篇:java中的线程池 JUC篇:ThreadLocal的应用与原理 在JDK的并发包里提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier和 Semaphore工具类提供了一种并发流程控制的手

    2023年04月24日
    浏览(35)
  • Java中的文件操作

    Java中通过 java.io.File 类来对⼀个⽂件(包括⽬录)进⾏抽象的描述。注意,有File对象, 并不代表真实存在该⽂件。  1.1 属性 在Java中提供了这两个常量来获取对应的系统的文件路径分隔符 pathSeparatorChar是一个字符常量,表示系统相关的路径分隔符。它的值由fs.getPathSeparato

    2024年01月21日
    浏览(93)
  • 流式数据处理中的微服务架构:使用Kubernetes和ApacheFlink

    作者:禅与计算机程序设计艺术 随着业务数据的海量增长、各种新型设备、软件和互联网应用不断涌现,传统单机计算无法满足业务处理需求的同时,大数据平台的出现提供了一种更高效、更便捷的解决方案。如何在大数据平台上部署分布式、弹性的微服务架构,成为关键。

    2024年02月07日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包