【Java8新特性】四、强大的Stream api


这里写自定义目录标题

  • 一、了解Stream
  • 二、流(stream)到底是什么?
  • 三、Stream操作的三个步骤
  • 四、创建Stream的四种方式
  • 五、Stream 的中间操作
    • 1、筛选和切片
    • 2、map 映射
    • 3、排序
  • 六、Stream 的终止操作
    • 1、查找和匹配
    • 2、归约
    • 3、收集

一、了解Stream

Stream是Java8中处理集合的关键抽象概念,对集合进行的操作,可以指定非常复杂的查找、过滤和映射数据等操作。

二、流(stream)到底是什么?

流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列

【注意】
①、Stream 自己不会存储元素
②、Stream不会改变源对象。相反,他们会返回一个持有结果的新Stream
③、Stream操作是延迟执行的。这意味着它们会等到需要结果的时候才执行

三、Stream操作的三个步骤

  1. 创建Stream
    一个数据源(如:集合,数组),获取一个流

2)中间操作
一个中间操作链,对数据源的数据进行处理

3)终止操作
一个终止操作,执行中间操作链,并产生结果
在这里插入图片描述

四、创建Stream的四种方式

1、可以通过Collection系列集合提供的stream()或 parallelStram() 创建流

  List<String> list = new ArrayList<>();Stream<String> stream1 = list.stream();

2、通过Arrays中的静态方法stream()来获取数组流

  Employee[] emps = new Employee[10];Stream<Employee> stream2 = Arrays.stream(emps);

3、通过Stream中的静态方法 of() 创建流

 Stream<String> stream3 =  Stream.of("aa","bb","cc");

4、由函数创建流:创建无限流

Stream<Integer> stream4 = Stream.iterate(0, (x) -> x + 2);
stream4.limit(10).forEach(System.out::println);Stream<Double> s = Stream.generate(() -> Math.random());
s.limit(10).forEach(System.out::println);

五、Stream 的中间操作

【注意】多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的
处理!,而是在终止操作时一次性处理,称为“惰性求值”

1、筛选和切片

  • filter - 接受Lambda,从流中排除某些元素
  • limit - 截断流,使其元素不超过给定数量
  • skip - 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足n,则返回一个空流。
  • distinct - 筛选,通过流所生成元素的hashCode()和equals()去除重复元素
public class TestStream2 {List<Employee> employees = Arrays.asList(new Employee("张三",18,3000),new Employee("李四",45,4000),new Employee("王五",37,3000),new Employee("赵六",18,6000),new Employee("田七",40,10000),new Employee("田七",40,10000));//filter//内部迭代:迭代操作由Stream API完成@Testpublic void test1(){//中间操作不会不会有任何结果Stream<Employee> sm = employees.stream().filter((e) -> e.getAge() > 25);//终止操作//sm.forEach((e) -> System.out.println(e));sm.forEach(System.out::println);}//limit@Testpublic void test2(){employees.stream().filter((e) -> e.getAge() > 25).limit(2).forEach(System.out::println);}//skip@Testpublic void test3(){employees.stream().filter((e) -> e.getAge() > 25).skip(2).forEach(System.out::println);}//distinct() 【注意】比较的元素需要equals()方法@Testpublic void test4(){employees.stream().filter((e) -> e.getAge() > 25).skip(2).distinct().forEach(System.out::println);}
}

2、map 映射

  • map:接收一个函数作为参数,该函数会被用到每个元素上,并将其映射成一个新的元素
  • flatMap: 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
@Testpublic void test5(){List<String> list = Arrays.asList("aaa","bb","ccc");list.stream().map((str) -> str.toUpperCase()).forEach(System.out::println);System.out.println("-----------------------------------");employees.stream().map(Employee::getName).forEach(System.out::println);System.out.println("------------------------------------");Stream<Stream<Character>> sm = list.stream().map(TestStream2::filterCharacter);sm.forEach((stm) -> stm.forEach(System.out::println));System.out.println("------------------------------------");System.out.println("上述代码优化");list.stream().flatMap(TestStream2::filterCharacter).forEach(System.out::println);}//方法:将字符串转换成一个流
public static Stream<Character> filterCharacter(String str){List<Character> list = new ArrayList<>();for(Character c: str.toCharArray()){list.add(c);}return list.stream();
}

3、排序

  • sorted() : 自然排序
  • sorted(Comparator com) : 定制排序
 @Testpublic void test6(){List<String> list = Arrays.asList("aaa","bb","ccc");list.stream().sorted().forEach(System.out::println);System.out.println("------------------------------------");list.stream().sorted((x,y) -> -x.compareTo(y)).forEach(System.out::println);}

六、Stream 的终止操作

1、查找和匹配

allMatch - 检查是否匹配所有元素
anyMatch - 检查是否至少匹配一个元素
noneMatch - 检查是否没有匹配所有元素
findFirst - 返回第一个元素
FindAny - 返回当前流中的任意元素
count - 返回当前流中元素的总个数
max - 返回流中的最大值
min - 返回流中的最小值

2、归约

reduce(T identity,BinaryOperater) / reduce(BinaryOperater): 可以将流中元素反复结合起来,得到一个值。返回 T

public void test(){List<Integer> list = Arrays.asList(1,2,3,4,5);//0称之为起始元素,将0作为x,在流中取出一个元素作为y,//然后将相加的结果作为x,再从流中取出一个元素作为y相加...//一直到流中的元素全部加完Integer sum = list.stream().reduce(0, (x, y) -> x + y);System.out.println(sum);System.out.println("------------------------------");//获取当前公司中,工资的总和Double sumSalary = employees.stream().map(Employee::getSalary).reduce(0d, (x, y) -> x + y);System.out.println(sumSalary);}

3、收集

  • collect:将流转换为其他形式。接收一个 Collector接口的实现

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

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

相关文章

同旺科技 USB TO SPI / I2C 专业版 极限测试 ---- 读取数据

所需设备&#xff1a; 1、USB 转 SPI I2C 适配器&#xff1b;内附链接 备注&#xff1a;带EXCEL调试的只适用于专业版&#xff1b; 软件配置&#xff1a; 设置如下&#xff0c;读取65500个字节&#xff0c;单条指令&#xff0c;速率20Mhz; 数据&#xff1a; 时钟信号&#…

Day10:学习尚上优选项目

学习计划&#xff1a;完成尚硅谷的尚上优选项目 学习进度&#xff1a;尚上优选项目 知识点&#xff1a; 五、尚上优选微信小程序端 订单支付 需求分析 页面效果功能分析对应接口 开发接口 创建service-payment模块 创建子模块service-payment创建配置文件创建启动类引入依赖…

微信扫码授权登录成功后,重定向用户回到他们最初尝试访问的URL

你的需求是在微信扫码授权登录成功后&#xff0c;重定向用户回到他们最初尝试访问的URL&#xff0c;而不是重定向到一个固定的页面。为了实现这一点&#xff0c;你需要在用户登录前&#xff0c;将他们尝试访问的页面URL保存起来&#xff0c;然后在登录成功后&#xff0c;使用这…

了解 Python 中 gc.collect() 命令

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 在 Python 中&#xff0c;gc.collect() 命令是用于手动触发垃圾回收机制&#xff0c;以回收无法访问的对象所占用的内存。Python 的垃圾回收机制主要基于引用计数&#xff0c;辅以 “标记-清除” 和 “…

echarts坐标轴、轴线、刻度、刻度标签

坐标轴 x、y轴 x 轴和 y 轴都由轴线、刻度、刻度标签、轴标题四个部分组成。部分图表中还会有网格线来帮助查看和计算数据 普通的二维数据坐标系都有x轴和y轴&#xff0c;通常情况下&#xff0c;x轴显示在图表底部&#xff0c;y轴显示在左侧&#xff0c;一般配置如下&#xf…

【数据结构】树与森林(树的存储结构、森林与二叉树的转化、树与森林的遍历)

目录 树和森林树的存储结构一、树的双亲表示法&#xff1a;二、树的孩子表示法方法一&#xff1a;定长结点的多重链表方法二&#xff1a;不定长结点的多重链表方法三&#xff1a;孩子单链表表示法 三、树的二叉链表(孩子-兄弟)存储表示法 森林与二叉树的转换树和森林的遍历先根…

QT使用单例模式创建全局引用类

单例模式介绍 单例模式是一种设计模式,用于确保类只能创建一个实例,并提供一种全局访问该实例的方式。在单例模式中,类的构造函数被私有化,这样就不能通过常规方式创建对象实例。相反,类提供一个静态方法或静态变量来获取其唯一的实例。 单例模式通常用于管理全局状态或…

设计一个健壮的漏洞检测模块需要考虑多个方面

设计一个健壮的漏洞检测模块需要考虑多个方面&#xff0c;包括漏洞数据库、扫描策略、结果解析和报告生成等。以下是一个简化的设计概述和一些模拟数据及测试示例。 漏洞检测模块设计 漏洞数据库&#xff1a; 包含一个已知的漏洞列表&#xff0c;每个漏洞都有唯一的标识符、描…

MPP-媒体软件V5.0开发参考

0. 写在前面 本篇博文用于记录工作项目中遇到的ss928板端视频获取相关内容。、 1. API参考 系统控制实现MPP(Media Process Platform)系统初始化、系统绑定解绑、获取MPP版本号、视频缓存池初始化、创建视频缓存池等功能。 ●ss_mpi_sys_set_cfg:配置系统控制参数。 ●ss_mp…

uni-app实现分页--(1)准备工作,首页下拉触底加载更多

实现流程如下: 分析&#xff1a;需要在滚动容器中添加滚动触底&#xff0c;在猜你喜欢中获取数据。难点&#xff1a;如何在父页面调用子组件内的方法。父组件中用ref&#xff0c;并定义组件实例类型&#xff0c;子组件中暴露方法 具体代码如下&#xff1a; 1.在父组件中添加…

sqlplus / as sysdba下中文乱码问题

export NLS_LANGamerican_america.AL32UTF8 export LANGen_US.UTF-8 set NLS_LANGamerican_america.AL32UTF8 set LANGen_US.UTF-8 select userenv(language) from dual;可以查出数据库的字符集 select * from nls_database_parameters where parameter LIKE %CHARACTERSET%…

计算机专业考研考哪些专业课

https://zhuanlan.zhihu.com/p/182416996 计算机专业考研的专业课通常包括以下几个主要科目&#xff0c;但具体的考试科目和内容可能会根据不同的学校和专业方向有所差异&#xff1a; 数据结构&#xff1a; 这是计算机科学的基础课程之一&#xff0c;涉及算法和数据结构的设计、…

计算机视觉——基于深度学习UNet实现的复杂背景文档二值化算法实现与模型训练

1. 引言 阈值分割可以被视为一个分类问题&#xff0c;通常涉及两个类别&#xff0c;这也是为什么阈值分割也被称为二值化。对于文档图像&#xff0c;我们期望阈值算法能够正确地将墨水分类为黑色&#xff0c;将纸张分类为白色&#xff0c;从而得到二值化图像。对于数字灰度图像…

OpenCV | 基于视频的基础操作

目录 一. OpenCV 关于视频的基础操作1. cv.VideoCapture ( ) 读取摄像头 / 视频文件2. cv.VideoCapture ( ).set ( ) 设置视频属性3. cv.VideoCapture ( ).get ( ) 打印视频属性4. cv.VideoCapture ( ).read ( ) 读帧5. capture.release ( ) 释放资源6. cv.VideoWriter ( ) 视频…

ruoyi-nbcio-plus基于vue3的flowable的自定义业务撤回申请组件的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

《前端面试题》- JS基础 - 简单谈谈ES6新增了哪些内容

问题 简单谈谈ES6新增了哪些内容 回答 ES新增的对象有&#xff1a; Symbol、Set、Map、WeakSet和WeakMap、ArrayBuffer、TypedArray、DataView、Promise、GeneratorFunction 和 Generator、Reflect、Proxy 具体可参考&#xff1a;https://www.jianshu.com/p/b54f7ad1cae3ht…

想做产品经理,应该选择什么专业?

产品经理作为互联网公司的核心职位&#xff0c;一直以来备受关注。随着互联网的不断发展&#xff0c;产品经理的需求也越来越高&#xff0c;很多人都想要了解哪些专业适合做产品经理。本文将为大家介绍几个适合做产品经理的专业。 1、心理学相关专业 C端产品工作的本源&#x…

【产品】ANET智能通信管理机 物联网网关 电力监控/能耗监测/能源管理系统

产品概述 本系列智能通信管理机是一款采用嵌入式硬件计算机平台&#xff0c;具有多个下行通信接口及一个或者多个上行网络接口&#xff0c;用于将一个目标区域内所有的智能监控/保护装置的通信数据整理汇总后&#xff0c;实时上传主站系统&#xff0c;完成遥信、遥测等能源数据…

在 Mac 上配置高级内容缓存设置

在 Mac 上配置高级内容缓存设置 您可以使用高级配置参数针对网络配置微调内容缓存。 您可以在“终端”中使用命令行或通过修改“/资源库/Preferences/com.apple.AssetCache.plist”文件中的键值&#xff0c;来设定内容缓存的高级配置参数。若要使某些更改生效&#xff0c;必须…

如何更改 CSS 背景图片的不透明度

介绍 opacity 是一个 CSS 属性&#xff0c;允许你改变元素的不透明度。默认情况下&#xff0c;所有元素的值为 1。通过将这个值更接近 0&#xff0c;元素将会变得越来越透明。 一个常见的用例是将图像作为背景的一部分。调整不透明度可以提高文本的可读性或实现所需的外观。然…