Java流式操作——Collectors工具类

文章目录

  • 背景
  • 方法
  • 实践说明
    • 一、前提条件
      • Person类
      • Data类
    • 二、操作
      • 转换类型
        • toList():将流中的元素收集到一个List集合中。
        • toSet():将流中的元素收集到一个Set集合中。
        • toMap():将流中的元素收集到一个Map集合中,可以指定键和值的提取方式。
      • maxBy:获取流中最大元素;minBy:获取流中最小元素
      • counting():统计流中元素的个数。
      • partitioningBy():根据指定的条件将流中的元素进行分区。
      • joining:合并,将流中的元素,以字符串的形式拼接起来
      • summingInt:把流中的元素映射成int类型的元素,求和
      • averagingInt:把流中的元素映射成int类型的元素,求平均值
      • summarizingInt:把流中的元素映射成int类型的元素,获取描述信息

背景

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

方法

● 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工具类_第2张图片


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


如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞+收藏+评论脚印支持一下博主~

你可能感兴趣的:(java8,流式操作,Collectors)