什么是最终操作?
当我们通过最终方法对流对象进行操作,说明stream流操作也完成,最后我们将对象汇总成一个结果(总数、对象、集合……)
方法
collect:将Stream中的元素汇总(转化)成一个结果,可以是Set、List、Map
reduce:归纳,可以计算总和
Matching:规矩自定义的规则判断元素的匹配情况,返回布尔类型
- allMatch:是否全部匹配
- anyMatch:任意一个匹配
- noneMatch:没有匹配
max&min:通过一定的比较规则,返回stream中最大元素和最小元素
count:返回stream中元素的总个数
forEach:循环
实战说明
一、前提条件
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, 45));
personList.add(new Person("邓十一", 20, 35));
personList.add(new Person("刘十二", 20, 99));
personList.add(new Person("小十三", 20, 56));
return personList;
}
}
二、操作
collect:将Stream中的元素汇总(转化)成一个结果,可以是Set、List、Map
/**
* @Description:最终操作——collection方法
* @Date: 2023/5/1 11:32
* @return: void
**/
public void test() {
Stream<Person> stream = Data.getData().stream();
//转化为List集合
List<Person> list = stream.collect(Collectors.toList());
//转化成Set集合
Set<Person> set = stream.collect(Collectors.toSet());
//转化成Map集合
Map<String, Integer> maps = stream.collect(Collectors.toMap(Person::getName, Person::getScore));
//输出结果
System.out.println(list);
System.out.println("--------------------------------------------------------------------------");
System.out.println(set);
System.out.println("--------------------------------------------------------------------------");
System.out.println(maps);
}
输出结果:
reduce:归纳,可以计算总和
实例一、计算1-10的和
//声明一个stream对象
Stream<Integer> stream1 = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//累加计算和
Optional<Integer> ret = stream1.reduce((n1, n2) -> n1 + n2);
//输出结果
System.out.println(ret.get());
输出结果:
实例二、计算所有学生的总成绩
//获取数据源
Stream<Person> stream = Data.getData().stream();
//计算总成绩
Optional<Person> reduce = stream.reduce((n1, n2) -> new Person().setScore(n1.getScore() + n2.getScore()));
//输出总成绩
System.out.println(reduce.get().getScore());
通过实例我们会发现每次执行reduce都会产生很多临时对象,这样是很损耗性能的,我们可以通过实例化一个对象固定,这样就不会实例化很多临时对象.
//实例化一个临时对希望
Person tmp = new Person();
//计算总成绩
Optional<Person> reduce1 = stream.reduce((n1, n2) -> tmp.setScore(n1.getScore() + n2.getScore()));
//输出总成绩
System.out.println(reduce1.get().getScore());
输出结果:
Matching:规矩自定义的规则判断元素的匹配情况,返回布尔类型
- allMatch:是否全部匹配
- anyMatch:任意一个匹配
- noneMatch:没有匹配
//获取数据源
Stream<Person> stream = Data.getData().stream();
//判断集合中是否包含成绩大于80的人员
boolean result1 = stream.allMatch(ele -> ele.getScore() > 80);
System.out.println("allMatch:"+result1);
//判断集合中是否所有的成员成绩都及格
boolean result2 = stream.anyMatch(ele -> ele.getScore() >= 60);
System.out.println("anyMatch:"+result2);
//判断集合中是否所有的成员成绩都及格
boolean result3 = stream.noneMatch(ele -> ele.getScore() <= 60);
System.out.println("noneMatch:"+result3);
输出结果:
max&min:通过一定的比较规则,返回stream中最大元素和最小元素
//找出成绩最高的对象
Optional<Person> max = Data.getData().stream().max((ele1, ele2) -> ele1.getScore() - ele2.getScore());
System.out.println(max);
//找出成绩最低的对象
Optional<Person> min = Data.getData().stream().min((ele1, ele2) -> ele1.getScore() - ele2.getScore());
System.out.println(min);
输出结果:
count:返回stream中元素的总个数
//获取数据源
Stream<Person> stream = Data.getData().stream();
//返回总个数
long count = stream.count();
//输出结果
System.out.println(count);
输出结果:
forEach:循环
//获取数据源
Stream<Person> stream = Data.getData().stream();
//循环输出集合对象
stream.forEach(System.out::println);
输出结果: