Java8流式操作——最终操作

简介: 当我们通过最终方法对流对象进行操作,说明stream流操作也完成,最后我们将对象汇总成一个结果(总数、对象、集合……)

什么是最终操作?


当我们通过最终方法对流对象进行操作,说明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);
    }


输出结果:


0a2a2acda95b0bfafef0a8582eb8f704.png


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());


输出结果:


78c0227794a92b0ff2fb28c017893588.png


实例二、计算所有学生的总成绩


//获取数据源
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());


输出结果:


dad34b197325dd86530d303ca5135353.png


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);


输出结果:


8fb848c43c95079df88ad66309cef97c.png


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);


输出结果:


3587b2365a8a6abcad85448fb6e87b2f.png


count:返回stream中元素的总个数


//获取数据源
Stream<Person> stream = Data.getData().stream();
//返回总个数
long count = stream.count();
//输出结果
System.out.println(count);


输出结果:


af15ec5b7149c5aca1a809aed9afe2ee.png


forEach:循环


//获取数据源
Stream<Person> stream = Data.getData().stream();
//循环输出集合对象
stream.forEach(System.out::println);


输出结果:


d8d517f5dfd800e7c4fdddbfca14bc42.png


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

相关文章
|
6月前
|
Java API
掌握Java 8 Stream API的艺术:详解流式编程(三)
掌握Java 8 Stream API的艺术:详解流式编程
50 2
|
6月前
|
SQL 存储 Java
java流式计算Stream
java流式计算Stream
40 0
|
6月前
|
SQL Java API
Java 8:Stream API 流式操作
Java 8:Stream API 流式操作
91 0
|
4月前
|
搜索推荐 Java 大数据
Java中的数据流处理与流式计算实现
Java中的数据流处理与流式计算实现
|
4月前
|
并行计算 Java 大数据
Java中的函数式接口与流式编程
Java中的函数式接口与流式编程
|
5月前
|
设计模式 Java
Java设计模式:建造者模式之经典与流式的三种实现(四)
Java设计模式:建造者模式之经典与流式的三种实现(四)
|
5月前
|
Java API 数据处理
学会在Java中使用流式API
学会在Java中使用流式API
|
6月前
|
存储 SQL Java
Java8 Stream API 详解:流式编程进行数据处理
Java8 Stream API 详解:流式编程进行数据处理
|
6月前
|
Java API
java流式实现chatGPT会话功能
java流式实现chatGPT会话功能
205 1
|
6月前
|
存储 Java BI
掌握Java 8 Stream API的艺术:详解流式编程(二)
掌握Java 8 Stream API的艺术:详解流式编程
51 1