背景
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());
输出结果:
文章来源:https://www.toymoban.com/news/detail-432271.html
Collectors工具类提供了丰富的功能,可以方便地对流进行各种操作和处理,简化了代码的编写。需要注意的是,Collectors工具类是在Java 8中引入的,需要使用Java 8及以上版本才能使用。
如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞+收藏+评论脚印支持一下博主~文章来源地址https://www.toymoban.com/news/detail-432271.html
到了这里,关于Java流式操作——Collectors工具类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!