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


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

相关文章
|
2月前
|
存储 Java 数据处理
|
新零售 Java C++
java脚本引擎的设计原理浅析
本人在阿里巴巴长期担任和负责规则引擎、流程引擎相关的技术开发,另外还负责开发和维护开源项目:https://github.com/alibaba/QLExpress QLExpress是一个脚本引擎工具,类似Groovy,JRuby等,是为了解决当时电商规则动态编译、表达式高精度计算、复杂布尔运算、自定义函数和操作符号、语法树生成等需求而设计的。
15627 0
|
14天前
|
Java API
java流式实现chatGPT会话功能
java流式实现chatGPT会话功能
20 1
|
5月前
|
Java API 数据库
Java8中的Stream的汇总和分组操作~它并不难的
Java8中的Stream的汇总和分组操作~它并不难的
61 0
|
8月前
|
存储 编解码 Java
Java特殊操作流
Java特殊操作流
26 0
Java特殊操作流
|
10月前
|
Java
Java8流式操作——中间操作
imit:限制,只取流中前指定位的元素。从前往后数,只取前xxx个元素
|
10月前
|
存储 Java
Java8新特性-流式操作
更像是一个迭代器,有序的获取到数据源中的每一个数据,并且可以对这些数据进行一些操作
|
11月前
|
算法 Java C++
i = i++ 计算过程还不会?C/C++ 的输出语句与Java 有何不同?(上)
i = i++ 计算过程还不会?C/C++ 的输出语句与Java 有何不同?
76 0
|
11月前
|
存储 Java C语言
i = i++ 计算过程还不会?C/C++ 的输出语句与Java 有何不同?(下)
i = i++ 计算过程还不会?C/C++ 的输出语句与Java 有何不同?
83 0
|
11月前
|
存储 Java
【Java I/O 流】I/O 流的原理与流的分类
所谓 I/O 是 Input/Output 的缩写,即输入/输出。I/O 技术用于处理数据的传输,文件的读写等。 数据传输可以看做是一种数据的流动,而流(Stream)可以理解为数据传输时的序列。按照数据的“流向”,流可分为输入流和输出流。
64 1

相关课程

更多