我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java8中Stream的使用方式是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java8中Stream的使用方式是什么

这篇文章主要介绍“Java8中Stream的使用方式是什么”,在日常操作中,相信很多人在Java8中Stream的使用方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java8中Stream的使用方式是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1. 为什么有经验的老手更倾向于使用Stream

  • 性能优势,(大数据量)相较于迭代器,速度更快

  • 支持串行与并行处理,并行处理更能充分利用CPU的资源

  • Stream 是一种计算数据的流,它本身不会存储数据

  • 支持函数式编程

  • 代码优雅,让代码更高效,干净,简洁

2. Stream 的使用方式

三步操作:

  • 创建Stream

  • 中间操作

  • 终止操作

3. Stream 的创建

Stream 的 创建都会依赖于数据源,通常是容器或者数组 Stream 流的创建大致分为4中,最为常用的就是通过集合创建

import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.stream.IntStream;import java.util.stream.Stream;public class CreateStreamDemo {    public static void main(String[] args) {        // 1 通过集合创建Stream也是用的最多的一种形式        List<String> strList = new ArrayList<>();        strList.add("a");        strList.add("b");        strList.add("c");        // 创建串行操作流        Stream<String> stream = strList.stream();        // 创建并行操作流        Stream<String> parallelStream = strList.parallelStream();        // 2 通过数组创建Stream        int[] arr = new int[]{1,2,3};        IntStream intStream = Arrays.stream(arr);        // 3 通过Stream.of        Stream<Integer> integerStream = Stream.of(1,2,3);        Stream<String> stringStream = Stream.of("a","b","c");        // 4 无限流        // 每隔五个数取一个        Stream.iterate(0, t -> t + 5).forEach(System.out::println); // 迭代        Stream.generate(Math::random).forEach(System.out::println); // 生成    }}

4. Stream 中间操作

Stream 中间操作,我们最为常用的就是过滤,去重,排序 本章包含我们开发最常用的对对象的去重,和更据对象中的对个属性组合排序

import com.zhj.java8.bean.Student;import java.util.ArrayList;import java.util.Comparator;import java.util.List;import java.util.TreeSet;import java.util.stream.Stream;import static java.util.stream.Collectors.collectingAndThen;import static java.util.stream.Collectors.toCollection;public class MiddleStreamDemo {    public static void main(String[] args) {        List<Student> students = new ArrayList<>();        students.add(new Student(1,"小华",23,1));        students.add(new Student(1,"小华",23,2));        students.add(new Student(2,"小米",20,2));        students.add(new Student(3,"小果",30,3));        students.add(new Student(4,"小维",18,2));        // 过滤        students.stream().filter(stu -> stu.getAge() > 20).forEach(System.out::println);        // 去重        // 对对象去重是根据引用去重,内容重复并不会去重,除非重写equals和hashCode方法        System.out.println("----------去重----------");        System.out.println("去重1----------");        students.stream().distinct().forEach(System.out::println);        // 对集合中对象某些属性去重,不重写equals和hashCode方法,只能借助其他数据结构来辅助去重        // 单个属性可以stu -> stu.getId()        // 多个属性可以stu -> stu.getId() + ";" + stu.getName()        System.out.println("去重2----------");        ArrayList<Student> distinctList = students.stream().collect(                collectingAndThen(toCollection(() -> new TreeSet<>(Comparator.comparing(stu -> stu.getId() + ";" + stu.getName()))), ArrayList::new)        );        distinctList.stream().forEach(System.out::println);        // 排序 支持定义排序方式        // sorted 默认使用 自然序排序, 其中的元素必须实现Comparable 接口        System.out.println("----------排序----------");        System.out.println("排序1----------");        students.stream().sorted().forEach(System.out::println);        // sorted(Comparator<? super T> comparator) :我们可以使用lambada 来创建一个Comparator 实例。可以按照升序或着降序来排序元素。        System.out.println("排序2----------");        students.stream()                .sorted(Comparator.comparing(Student::getAge,Comparator.reverseOrder())) // ,Comparator.reverseOrder() 逆序                .forEach(System.out::println);        // 创建比较器,通过对比较器内容的定义实现对多个属性进行排序,类似sql中连续的orderBy        System.out.println("排序3----------");        students.stream().sorted(                (s1,s2) -> {                    if (s1.getAge() == s2.getAge()) {                        return s1.getSex().compareTo(s2.getSex());                    } else {                        return -s1.getAge().compareTo(s2.getAge());                    }                }        ).forEach(System.out::println);        System.out.println("排序4----------");        Comparator<Student> studentComparator = (s1,s2) -> {            Integer age1 = s1.getAge();            Integer age2 = s2.getAge();            if (age1 != age2) return age1 - age2;            Integer sex1 = s1.getSex();            Integer sex2 = s2.getSex();            if (sex1 != sex2) return sex2 - sex1;            return 0;        };        students.stream().sorted(studentComparator).forEach(System.out::println);        // 截取 截取前三个元素        System.out.println("----------截取----------");        students.stream().limit(3).forEach(System.out::println);        // 跳过 跳过前3个元素        System.out.println("----------跳过----------");        students.stream().skip(3).forEach(System.out::println);        // 映射        System.out.println("----------映射----------");        System.out.println("映射Map----------");        // map接收Lambda,将元素转换其他形式,或者是提取信息,并将其映射成一个新的元素        Stream<Stream<Student>> streamStream1 = students.stream().map(str -> filterStudent(str));        streamStream1.forEach(sm -> sm.forEach(System.out::println));        System.out.println("映射flatMap----------");        // map接收Lambda,将流中的每一个元素转换成另一个流,然后把所有流连成一个流 扁平化映射        Stream<Student> studentStream2 = students.stream().flatMap(str -> filterStudent(str));        studentStream2.forEach(System.out::println);        // 消费        System.out.println("----------消费----------");        students.stream().peek(stu -> stu.setAge(100)).forEach(System.out::println);    }    public static Stream<Student> filterStudent(Student student) {        student = new Student();        return Stream.of(student);    }}

Student

public class Student implements Comparable<Student> {    private Integer id;    private String name;    private Integer age;    private Integer sex;    public Student() {    }    public Student(Integer id, String name, Integer age, Integer sex) {        this.id = id;        this.name = name;        this.age = age;        this.sex = sex;    }    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    public Integer getSex() {        return sex;    }    public void setSex(Integer sex) {        this.sex = sex;    }    @Override    public String toString() {        return "Student{" +                "id='" + id + '\'' +                ", name='" + name + '\'' +                ", age='" + age + '\'' +                ", sex=" + sex +                '}';    }    @Override    public int compareTo(Student o) {        return this.getAge() - o.getAge();    }}

5. Stream 终止操作

Stream 的终止操作,最常用的就是讲处理过的数据收集到新的容器中,同时可以实现向Sql聚合函数,分组的一些效果

package com.zhj.java8.stream;import com.zhj.java8.bean.Student;import java.util.*;import java.util.stream.Collectors;public class TerminationStreamDemo {    public static void main(String[] args) {        List<Student> students = new ArrayList<>();        students.add(new Student(1,"小华",23,1));        students.add(new Student(2,"小米",20,2));        students.add(new Student(3,"小果",30,3));        students.add(new Student(4,"小维",18,2));        students.add(new Student(5,"小华",23,2));        System.out.println("--------------------匹配聚合操作--------------------");        // allMatch:接收一个 Predicate 函数,当流中每个元素都符合该断言时才返回true,否则返回false        boolean allMatch = students.stream().allMatch(stu -> stu.getAge() > 10);        System.out.println("全部符合大于10岁条件:" + allMatch);        // noneMatch:接收一个 Predicate 函数,当流中每个元素都不符合该断言时才返回true,否则返回false        boolean noneMatch = students.stream().noneMatch(stu -> stu.getAge() > 10);        System.out.println("全部不符合大于10岁条件:" + noneMatch);        // anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足该断言则返回true,否则返回false        boolean anyMatch = students.stream().anyMatch(stu -> stu.getAge() > 20);        System.out.println("含有任意符合大于20岁条件:" + anyMatch);        // findFirst:返回流中第一个元素        Student findFirst = students.stream().findFirst().get();        System.out.println("第一个学生:" + findFirst);        // findAny:返回流中的任意元素        Student findAny = students.stream().findAny().get();        System.out.println("任意一个学生:" + findAny);        //  count:返回流中元素的总个数        long count = students.stream().count();        System.out.println("学生总数:" + count);        // max:返回流中元素最大值        Student max = students.stream().max(Student::compareTo).get();        System.out.println("年龄最大学生:" + max);        // max:返回流中元素最大值        Student min = students.stream().min(Student::compareTo).get();        System.out.println("年龄最小学生:" + min);        System.out.println("--------------------规约操作--------------------");        System.out.println("学生年龄总和:" + students.stream().map(Student::getAge).reduce(Integer::sum));        System.out.println("学生年龄最大:" + students.stream().map(Student::getAge).reduce(Integer::max));        System.out.println("--------------------收集操作--------------------");        List<Student> list = students.stream().collect(Collectors.toList());        Set<Student> set = students.stream().collect(Collectors.toSet());        Map<Integer, String> map = students.stream().collect(Collectors.toMap(Student::getId, Student::getName));        String joinName = students.stream().map(Student::getName).collect(Collectors.joining(",", "(", ")"));        // 总数        students.stream().collect(Collectors.counting());        // 最大年龄        students.stream().map(Student::getAge).collect(Collectors.maxBy(Integer::compare)).get();        // 年龄和        students.stream().collect(Collectors.summingInt(Student::getAge));        // 平均年龄        students.stream().collect(Collectors.averagingDouble(Student::getAge));        // 信息合集        DoubleSummaryStatistics statistics = students.stream().collect(Collectors.summarizingDouble(Student::getAge));        System.out.println("count:" + statistics.getCount() + ",max:" + statistics.getMax() + ",sum:" + statistics.getSum() + ",average:" + statistics.getAverage());        // 分组        Map<Integer, List<Student>> collect = students.stream().collect(Collectors.groupingBy(Student::getSex));        System.out.println(collect);        //多重分组,先根据性别分再根据年龄分        Map<Integer, Map<Integer, List<Student>>> typeAgeMap = list.stream().collect(Collectors.groupingBy(Student::getSex, Collectors.groupingBy(Student::getAge)));        //分区        //分成两部分,一部分大于20岁,一部分小于等于20岁        Map<Boolean, List<Student>> partMap = list.stream().collect(Collectors.partitioningBy(v -> v.getAge() > 20));        //规约        Integer allAge = list.stream().map(Student::getAge).collect(Collectors.reducing(Integer::sum)).get();        System.out.println(allAge);    }}

6. Stream 特性

中间操作惰性执行

多个中间操作的话,不会多次循环,多个转换操作只会在终止操作的时候融合起来,一次循环完成

  • 内部迭代

  • 找到符合条件的数据后边的迭代不会进行

  • 流的末端操作只有一次

异常:stream has already been operated upon or closed

意思是流已经被关闭了,这是因为当我们使用末端操作之后,流就被关闭了,无法再次被调用,如果我们想重复调用,只能重新打开一个新的流。

到此,关于“Java8中Stream的使用方式是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java8中Stream的使用方式是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java8中Stream的使用方式是什么

这篇文章主要介绍“Java8中Stream的使用方式是什么”,在日常操作中,相信很多人在Java8中Stream的使用方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java8中Stream的使用方式
2023-06-30

Java8 Stream流常用方法是什么

这篇文章主要介绍了Java8 Stream流常用方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java8 Stream流常用方法是什么文章都会有所收获,下面我们一起来看看吧。一、概述Stream 是
2023-06-30

Java8中的Stream的原理是什么

本篇内容主要讲解“Java8中的Stream的原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java8中的Stream的原理是什么”吧!Stream的组成与特点Stream(流)是一个
2023-06-15

Java8中Stream怎么使用

今天小编给大家分享一下Java8中Stream怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、概述Java 8 是
2023-07-02

Java8中Stream有什么用

这篇文章主要为大家展示了“Java8中Stream有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java8中Stream有什么用”这篇文章吧。Java8对集合提供了一种流式计算的方式,这
2023-06-25

JAVA8 Stream流中的reduce()方法怎么使用

这篇文章主要介绍“JAVA8 Stream流中的reduce()方法怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JAVA8 Stream流中的reduce()方法怎么使用”文章能帮助大家解
2023-07-05

Java8 Stream流式编程怎么使用

这篇文章主要介绍了Java8 Stream流式编程怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java8 Stream流式编程怎么使用文章都会有所收获,下面我们一起来看看吧。一、Stream中间操作S
2023-07-05

Java8中Stream的常用方法有哪些

本文小编为大家详细介绍“Java8中Stream的常用方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java8中Stream的常用方法有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 简介java
2023-06-16

Java8中怎么利用Stream实现函数式接口

这期内容当中小编将会给大家带来有关Java8中怎么利用Stream实现函数式接口,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。函数式接口什么是函数式接口?简单来说就是只有一个抽象函数的接口。为了使得函数式
2023-06-16

java8 stream排序及自定义比较器的方法是什么

这篇文章主要讲解了“java8 stream排序及自定义比较器的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java8 stream排序及自定义比较器的方法是什么”吧!java8
2023-07-05

Java8处理数据的函数式方式是什么

本篇内容介绍了“Java8处理数据的函数式方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!处理数据的函数式方式Java 8 不仅仅添
2023-06-17

Java8函数式编程方法是什么

这篇“Java8函数式编程方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java8函数式编程方法是什么”文章吧。什
2023-06-26

Java中Stream的作用是什么

Java中Stream的作用是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3.
2023-06-14

java8中lambda表达式的语法是什么

这篇文章主要介绍“java8中lambda表达式的语法是什么”,在日常操作中,相信很多人在java8中lambda表达式的语法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java8中lambda表达式
2023-07-02

lambda表达式在java8中的使用方法

这篇文章给大家介绍lambda表达式在java8中的使用方法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。定义 TantanitReader:public class TantanitReader { private
2023-05-31

Node中的Stream是什么

本篇内容主要讲解“Node中的Stream是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node中的Stream是什么”吧!stream 是一个抽象的数据接口,它继承了 EventEmit
2023-07-05

MySQL中CURRENT_TIMESTAMP的使用方式是什么

这篇文章主要讲解了“MySQL中CURRENT_TIMESTAMP的使用方式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL中CURRENT_TIMESTAMP的使用方式是什么
2023-06-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录