java新特性stream

news2024/11/16 17:46:30

stream

Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的 Lambda ,给我们操作集合(Collection)提供了极大的便利。
Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。

stream特性

stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果。
stream不会改变数据源,通常情况下会产生一个新的集合或一个值。
stream具有延迟执行特性(惰性求值),只有调用终端操作时,中间操作才会执行。
stream是一次性的(一旦一个流对象经过一个终结操作后,这个流就不会被使用)

在这里插入图片描述
debug中可以看到流的执行过程。

常用操作

创建流

中间操作

每次返回一个新的流,可以有多个

终结操作

每个流只能进行一次终端操作,终端操作结束后流无法再次使用。终端操作会产生一个新的集合或值。

ctrl+alt+m可以自动封装为函数

创建流的方式

集合对象

集合对象.stream()

数组

Arrays.stream(数组)
 Integer arr[]={1,2,3,4,5};
        Stream<Integer> stream = Arrays.stream(arr);
        stream.distinct().forEach(integer -> System.out.println(integer));

双列集合

先转换为单列集合再创建
map.entrySet().stream();
 Map<String, Integer> map = new HashMap<>();
        map.put("蜡笔",11);
        map.put("蜡笔2",11);
        map.put("蜡笔3",11);

        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        entries.stream().distinct().forEach(stringIntegerEntry -> System.out.println(stringIntegerEntry));

stream中的常用API中间操作

filter

筛选,是按照一定的规则校验流中的元素,将符合条件的元素提取到新的流中的操作。

map与flatMap

在这里插入图片描述
flatMap
接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
举例说明
比如一个作者类里有
在这里插入图片描述
然后需要输出所有作者的所有书籍。
在这里插入图片描述
传统需要双重for循环,
flatMap将作者流中的值转换为书籍流,然后将所有书籍流组合成一个大流。

authors.stream()
                .flatMap((Function<Author, Stream<Book>>) author -> author.getBooks().stream())
                .distinct()
                .forEach(book -> System.out.println(book.getName()));

获取所有分类

authors.stream()
                .flatMap(author -> author.getBooks().stream())
                .distinct()
                .flatMap(book -> Arrays.stream(book.getCategory().split(",")))
                .distinct()
                .forEach(s -> System.out.println(s));

先将作者流转换为书籍流,然后将书籍流转换为分类流,最后对分类流进行操作。

二者区别

可以看出flatmap和map的参数差别在于,
map传入一个传入实体返回实体,
flatMap是传入实体返回的却是Stream流,
那既然是流,那么最好返回值本身是一个Stream,或者能被转换成Stream的对象!
flatmap的作用 —— 把嵌套集合,按照子集合的形式,
统一放入到新的一个集合中去,这就叫结果展平

例如,一个年级的学生,按照班级为单位,如今年段长想统计该年段所有的学生信息,一个flatmap就能轻松搞定,无需再for循环取遍历获取了~

distinct

可以去除流中的重复元素,底层依赖的是Object的equals方法来判断是否是相同对象。所以需要重写equals方法。

在这里插入图片描述

sorted

sorted,实现排序,中间操作。

如果调用空参的

实体类需要实现Comparable接口
在这里插入图片描述
重写方法,实现排序
在这里插入图片描述
调用有参的
需要重写里面的方法
在这里插入图片描述

limit

可以设置流的最大长度,超出的部分将被抛弃
例如:打印年龄最大的两个作者的姓名。

authors.stream()
                .distinct()
                .sorted()
                .limit(2)
                .forEach(author -> System.out.println(author.getName()));

skip

跳过流中的前n个元素了,返回剩下的元素

authors.stream()
                .sorted()
                .skip(1)
                .forEach(author -> System.out.println(author.getName()));

stream中常用API终结操作

forEach

对流中的元素进行遍历操作,我们通过传入参数去指定对遍历的元素进行什么具体操作。

count

可以获取流中元素的个数

  //打印这些作家的所出书籍的数目,去重
        long count = authors.stream()
                .flatMap(author -> author.getBooks().stream())
                .distinct()
                .count();
        System.out.println(count);

max与min

可以用来获取流中的最值

//获取作品中的最高分和最低分
        Optional<Integer> max = authors.stream()
                .flatMap(author -> author.getBooks().stream())
                .map(book -> book.getScore())
                .max((o1, o2) -> o1 - o2);
        System.out.println(max.get());

collect

把当前流转换为一个集合

例.获取一个存放所有作者名字的List集合

List<String> collect = authors.stream()
                .map(author -> author.getName())
                .collect(Collectors.toList());
        System.out.println(collect);

例.获取一个所有书名的set集合

Set<Book> collect1 = authors.stream()
                .flatMap(author -> author.getBooks().stream())
                .collect(Collectors.toSet());
        System.out.println(collect1);

例.获取一个map集合,map的key为作者名,value为List

Map<String, List<Book>> collect2 = authors.stream().distinct()
                .collect(Collectors.toMap(author -> author.getName(), author -> author.getBooks()));
        System.out.println(collect2);

anyMatch

只要有一个满足条件,就返回true

allMatch

如果都符合,结果为true

boolean b = authors.stream()
                .allMatch(author -> author.getAge() > 18);
        System.out.println(b);

noneMatch

可以判断流中元素是否都不符合匹配条件,如果都不符合结果为true

findAny

获取流中的任意一个,该方法没有办法保证获取的一定是流中的第一个元素。

findFirst

获取流中的第一个元素

reduce

归并
对流中的数据按照你制定的计算方法计算出一个结果
reduce的作用就是把stream()中的元素组合起来,我们可以传入一个初始值,他会按着我们的计算方式依次拿流中的元素和初始化值进行计算,计算结果在和后面的元素计算。

//求所有作者的年龄之和
        Integer reduce = authors.stream()
                .map(author -> author.getAge())
                .reduce(0, (integer, integer2) -> integer + integer2);
        System.out.println(reduce);
  //求所有作者中,年龄最小的值
        Integer reduce1 = authors.stream()
                .map(author -> author.getAge())
                .reduce(Integer.MAX_VALUE, (integer, integer2) -> integer > integer2 ? integer2 : integer);
        System.out.println(reduce1);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/711142.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PMP常用英文术语缩写总结(文字版+表格版+图片版)

PMP常用英文术语缩写总结&#xff08;文字版表格版图片版&#xff09; 文字版 PMBOK Project Management Body of Knowledge 项目管理知识体系 PMI Project Management Institute 项目管理协会 PMO Project Management Office 项目管理办公室 PMIS Project Management Inf…

Spring Boot 中的服务注册是什么,原理,如何使用

Spring Boot 中的服务注册是什么&#xff0c;原理&#xff0c;如何使用 Spring Boot 是一个非常流行的 Java 后端框架&#xff0c;它提供了许多便捷的功能和工具&#xff0c;使得开发者可以更加高效地开发微服务应用。其中&#xff0c;服务注册是 Spring Boot 微服务架构中非常…

代码源 线段树模板

线段树1 思路&#xff1a; 我们需要维护的东西是序列的最小值和最小值个数 这道题没有修改操作&#xff0c;因此不考虑修改 然后考虑Pushup 最小值很简单&#xff0c;直接取min 最小值个数怎么维护呢&#xff1f;考虑这个区间需要维护的值如何从左右两个区间获得 如果左右…

四.流程控制语句

1、条件语句 Go 编程语言中 if 条件语句的语法如下&#xff1a; 1、基本形式 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } If 在布尔表达式为 true 时&#xff0c;其后紧跟的语句块执行&#xff0c;如果false 则不执行。 package main import "fmt" fu…

Spring MVC是什么?详解它的组件、请求流程及注解

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 本文将讲解Spring MVC是什么&#xff0c;它的优缺点与九大组件&#xff0c;以及它的请求流程与常用的注解。 目录 一、Spring MVC是什…

计算机网络 - http协议 与 https协议(2)

前言 本篇介绍了构造http请求的的五种方式&#xff0c;简单的使用postman构造http请求&#xff0c;进一步了解https, 学习https的加密过程&#xff0c;了解对称密钥与非对称密钥对于加密是如何进行的&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流…

【数据科学和可视化】反思十年数据科学和可视化工具的未来

数据科学在过去十年中呈爆炸式增长&#xff0c;改变了我们开展业务的方式&#xff0c;并让下一代年轻人为未来的工作做好准备。但是这种快速增长伴随着对数据科学工作的不断发展的理解&#xff0c;这导致我们在如何使用数据科学从我们的大量数据中获得可操作的见解方面存在很多…

vue3实现一个简单的数字滚动效果

一、实现数字按步长递增的效果 1.实现思路 将这个组件封装起来&#xff0c;需要外部引用的文件传递两个值&#xff1a;指定数值 num 和 滚动持续时长 duration。首先设置一个增量 step&#xff0c;让数字按照这个增量来进行递增。然后设置一个定时器 setInterval&#xff0c;…

Flink集群部署总结

集群部署方式 Flink有两种部署方式&#xff0c;Standalone和Flink on Yarn集群部署方式。 Flink集群架构 Flink分布式架构是常见的主从结构&#xff0c;由JobManager和TaskManager组成。JobManager是大脑&#xff0c;负责接收、协调、分发Task到各个TaskManager&#xff0c;也…

靶场搭建——搭建pikachu靶场

搭建pikachu靶场 搭建pikachu靶场1、win11本机搭建步骤2、虚拟机win2012搭建步骤 我所碰见的问题以及解决方式&#xff1a; 搭建pikachu靶场 这里我所运用到的材料有&#xff1a;首先我最终是在虚拟机中环境为win2012和主机都搭建完成。 &#xff08;一个即可&#xff09; Ph…

在各数据库中使用 MERGE 实现插入避重 SQL

MERGE实现插入避重操作 前言 MERGE是一种在数据库管理系统中用于合并&#xff08;插入、更新或删除&#xff09;数据的SQL语句。它允许根据指定的条件将数据从一个表合并到另一个表中&#xff0c;同时避免重复插入或更新数据。 MERGE语句通常由以下几个关键字和子句组成&…

Spring Boot 中的服务消费

Spring Boot 中的服务消费 在分布式系统中&#xff0c;服务消费是一个很常见的场景。通过服务消费&#xff0c;可以将一个系统中的服务作为另一个系统中的组件来使用。Spring Boot 提供了很多工具来简化服务消费的过程&#xff0c;本文将深入探讨 Spring Boot 中的服务消费是什…

Java——《面试题——maven篇》

全文章节 Java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程&并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 Java——《面试题——MySQL篇》​​​​​​ Java——《面试题——SpringCloud》 Java——…

Redis数据库的简介、部署及常用命令

Redis数据库的简介、部署及常用命令 一、关系数据库与非关系型数据库概述1、关系型数据库2、非关系型数据库3、关系数据库与非关系型数据库区别4、非关系型数据库产生背景 二、Redis简介1、Redis服务器程序的单线程模型2、Redis的优点 三、Redis部署四、Redis 命令工具1、redis…

全概率公式和贝叶斯公式

人工智能和机器学习中经常听到一个著名公式&#xff1a;贝叶斯概率公式。早已忘记了&#xff0c;赶紧记一下笔记。 &#xff08;一&#xff09;全概率公式&#xff1a; 注意&#xff1a;全概率公式成立的前提是Bi是样本的划分 其证明过程如下&#xff1a; &#xff08;二&…

C++笔记之互斥锁,原子变量,条件变量对比

C笔记之互斥锁&#xff0c;原子变量&#xff0c;条件变量对比 code review! 目的&#xff1a;避免多线程间共享数据的竞态条件。 文章目录 C笔记之互斥锁&#xff0c;原子变量&#xff0c;条件变量对比1.std::mutex——互斥锁2.std::lock_guard3.std::unique_lock4.std::ato…

C++之lambda函数应用(一百四十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

如何看懂时序图(1):时序图基础知识

对于参考手册中经常出现的一些时序图&#xff0c;经常会让我摸不着头脑。比如对于Flash的时序图来说&#xff0c;要看懂的话&#xff0c;里面的每一个参数都得系统地学一遍&#xff0c;而且时序图中的一些符号也不太懂是什么意思。前一段时间调HyperRAM的时候&#xff0c;因为那…

冯·诺依曼架构哈佛架构(嵌入式学习)

冯诺依曼架构&哈佛架构 0. 前言1. 冯诺依曼架构&#xff08;von Neumann architecture&#xff09;关键组件限制&挑战 2. 哈佛架构关键组件限制&挑战 3. 冯诺依曼架构&哈佛架构的区别4. 知识扩展 0. 前言 冯诺依曼架构&#xff08;von Neumann architecture&a…

Python 命令行参数

Python 命令行参数 1、sys 库 sys.argv 获取参数2、getopt 模块解析带-参数2.1 短参数shortopts2.1.1 无短参数2.1.2 短参数h无值2.1.3 短参数h有值2.1.4 多个短参数h:v 2.2 长参数longopts2.2.1 长参数无值2.2.2 长参数有值 2.3 有空格字符串值 1、sys 库 sys.argv 获取参数 s…