java新特性stream

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.hqwc.cn/news/5276.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux性能瓶颈分析之TOP指标分析

Linux性能瓶颈分析之TOP指标分析 文章目录 Linux性能瓶颈分析之TOP指标分析一、查看CPU二、监控CPU总结 一、查看CPU 1.查看cpu基础信息 lscpu2.查看cpu详细信息 cat /proc/cpuinfo3.统计cpu信息 cat /proc/cpuinfo |grep "physical id" |sort |uniq |wc -l 查看…

Go语言使用net/http实现简单登录验证和文件上传功能

最近再看Go语言web编程&#xff0c;go语言搭建Web服务器&#xff0c;既可以用go原生的net/http包&#xff0c;也可以用gin/fasthttp/fiber等这些Web框架。本博客使用net/http模块编写了一个简单的登录验证和文件上传的功能&#xff0c;在此做个简单记录。 目录 1.文件目录结构…

Spring bean 生命周期

在互联网领域中&#xff0c;Spring框架扮演着重要的角色。作为一个开源的Java应用程序开发框架&#xff0c;Spring提供了一种灵活而强大的方式来构建可扩展的应用程序。Spring框架中的一个重要概念是Bean&#xff0c;它是Spring应用程序的基本构建块之一。了解Spring Bean的生命…

多元分类预测 | Matlab粒子群算法(PSO)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,PSO-HKELM分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab粒子群算法(PSO)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,PSO-HKELM分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matl…

Unity UGUI Canvas Overlay模式获取屏幕坐标

UGUI Canvas Overlay模式获取屏幕坐标 &#x1f354;效果&#x1f371;获取 &#x1f354;效果 &#x1f371;获取 ui的position就是屏幕坐标(●’◡’●) var screenPos new Vector2(transform.position.x, transform.position.y);

力扣 112. 路径总和

题目来源&#xff1a;https://leetcode.cn/problems/path-sum/description/ C题解1&#xff1a;递归法&#xff0c;前序遍历。先把当前节点加入sumtmp&#xff0c;再判断是不是叶子节点&#xff0c;如果是则判断sumtmp与targetSum的大小&#xff0c;不是则对其左右子树再次进行…

React解决setState异步带来的多次修改合一和修改后立即使用没有变化问题

我们编写这样一段代码 import React from "react" export default class App extends React.Component {constructor(props){super(props);this.state {cont: 0}}componentDidMount() {this.setState({cont: this.state.cont1})}render(){return (<div>{ thi…

【前端|CSS系列第2篇】CSS零基础入门之常用样式属性

欢迎来到CSS零基础入门系列的第二篇博客&#xff01;作为前端开发的关键技术之一&#xff0c;CSS&#xff08;层叠样式表&#xff09;能够为网页添加各种样式和布局效果。对于前端零基础的小白来说&#xff0c;了解和掌握CSS的常用样式属性是入门的关键。本篇博客将带你深入了解…

全志科技T507-H工业核心板规格书(4核ARM Cortex-A53,主频1.416GHz)

1 核心板简介 创龙科技SOM-TLT507是一款基于全志科技T507-H处理器设计的4核ARM Cortex-A53全国产工业核心板&#xff0c;主频高达1.416GHz。核心板CPU、ROM、RAM、电源、晶振等所有元器件均采用国产工业级方案&#xff0c;国产化率100%。 核心板通过邮票孔连接方式引出MIPI CS…

时间序列分解 | Matlab 互补集合经验模态分解(CEEMD)的信号分解

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列分解 | Matlab 互补集合经验模态分解(CEEMD)的信号分解 部分源码 %---------------------

TI AM64x工业核心板硬件说明书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)

1 硬件资源 创龙科技SOM-TL64x是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 单/四核Cortex-R5F 单核Cortex-M4F设计的多核工业级核心板&#xff0c;通过工业级B2B连接器引出5x TSN Ethernet、9x UART、2x CAN-FD、GPMC、PCIe/USB 3.1等接口。核心板经过专业的P…

记录好项目D20

记录好项目 你好呀&#xff0c;这里是我专门记录一下从某些地方收集起来的项目&#xff0c;对项目修改&#xff0c;进行添砖加瓦&#xff0c;变成自己的闪亮项目。修修补补也可以成为毕设哦 本次的项目是个springbootvue的图书管理系统项目 一、系统介绍 本项目前后端分离 …