Java,Stream API的使用

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

Stream和Collection集合的区别:Collection是一种静态的内存数据结构,讲的是数据,而Stream是有关计算的,讲的是计算。集合主要面向内存,储存在内存中。Stream主要面向CPU,通过CPU实现计算。

Stream API关注的是多个数据的计算(排序、查找、过滤、映射、遍历等)。

集合关注的是数据的存储。

说明:

  • Stream自己不会存储元素。

  • Stream不会改变源对象,而是会返回一个持有结果的新的Stream。

  • Stream操作是延迟执行的。要等到需要的结果的时候才执行。一旦执行终止操作,就执行中间操作,并产生结果。

  • Stream一旦执行了终止操作,就不能再调用其他中间操作或终止操作了。

Stream执行流程:

步骤一:Stream的实例化

    ·创建Stream方式一:通过集合。

List<Person> list = new ArrayList<>();
list.add(new Person(19,"limingmao"));
list.add(new Person(17,"qiuqiuren"));
list.add(new Person(18,"pianpianhua"));
//default Stream<E> Stream():返回一个顺序流
Stream<Person> stream = list.stream();
//default Stream<E> Stream():返回一个并行流
Stream<Person> stream1 = list.parallelStream();

    ·创建Stream方式二:通过数组。

//调用Arrays类的static <T> Stream<T> stream(T[] array):返回一个流
Integer[] arr = new Integer[]{1,3,4,5,6,7,};
Stream<Integer> stream = Arrays.stream(arr);
int[] arr1 = new int[]{1,2,3,4,5};
IntStream stream1 = Arrays.stream(arr1);

    ·创建Stream方式三:通过Stream的静态方法of( )。

//通过Stream的静态方法of()
Stream<String> stringStream = Stream.of("aa", "bb", "cc", "DD");

步骤二:一系列的中间操作

  • 筛选与切片:

filter(Predicate p):接受lambda,从流中排除某些元素。

limit(n):截断流,使得元素不超过指定量。

skip(n):跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。

distinct( ):筛选,通过流所生成元素的hashCode( )和equals( )去除重复元素。

  • 映射

map(Function f):接收一个函数作为参数,将元素转换为其他形式或提取信息,该函数会被应用到每一个元素上。

操作,例:

List<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
Stream<String> stream = list.stream();
stream.map(str -> str.toUpperCase());
  • 排序

sorted( ):自然排序。要求类实现Comparable接口。

sorted(Comparator com):定制排序,参数传入实现Comparator接口的对象,指定排序方式。

步骤三:执行终止操作

终止操作会从流的流水线生成结果。其结果可以是任何不是流的值,例如,List、Integer,也可以是void。

流进行了终止操作后不能再次使用。

  • 匹配和查找:

allMatch(Predicate p):检查是否匹配所有元素。

anyMatch(Predicate p):检查是否至少匹配一个元素。

findFirst( ):返回第一个元素。

count( ):返回元素中的总个数。

max(Comparator c):返回流中的最大值。

min(Comparator c):返回流中的最小值。

forEach(Consumer c):内部迭代。

  • 归约:

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

reduce(BinaryOperator):可以将流中的元素反复结合起来,得到一个值。

  • 收集

collection(Collection c):将流转换为其他形式。接收一个Collection接口的实现,用于给Stream中元素做汇总的方法。

Stream中的Lambda表达式与方法引用的使用

Stream的使用中会用到较多的接口哦,使用Lambda表达式和方法引用的方式会更方便。

以两个例子为例

例一,比如:要打印出存放Person的对象的集合list里的对象的年龄的总和

System.out.println(list.stream().map(Person::getAge).reduce(Integer::sum));

map方法的参数中放的是一个Function的实现类对象,此时应用到每一个元素上的操作是调用每一个Person对象的getAge方法得到每一个对象的年龄,apply方法的参数是一个Person类的对象A,apply方法中,A调用了getAge方法,而getAge方法没有参数,满足方法n和n - 1的关系,可以使用方法引用的类 :: 实例方法 的方式表示,即为 Person :: getAge 。reduce方法中同理。

例二,比如:要打印所有大于十七岁的Person对象的信息

stream.filter(emp -> emp.getAge() > 17).forEach(System.out::println);

filter方法的参数中放的是一个Predicate的实现类对象,只有一个参数,所以->左边放一个变量,返回值是一个boolean类型的值,只有一条return语句,所以直接将return后面的emp.getAge( ) > 17放在->后面,便形成了lambda表达式。

forEach方法中放入的是一个Consumer的实现类对象,accept方法的返回值(类型推断后)与System.out对象调用的Println方法的返回值一致。便可以使用方法引用的方式,表示为System.out :: println 。

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

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

相关文章

在Spring Boot中使用@Async实现一个异步调用

在使用异步注解之前&#xff0c;我们需要先了解&#xff0c;什么是异步调用&#xff1f; 异步调用对应的事同步调用&#xff0c;同步调用是值程序按照我们定义的顺序依次执行&#xff0c;每一行程序都必须等待上一行的程序执行完成之后才执行&#xff0c;而异步是指在顺序执行…

YOLOv8 第Y7周 水果识别

1.创建文件夹&#xff1a; YOLOv8开源地址 -- ultralytics-main文件下载链接&#xff1a;GitHub - ultralytics/ultralytics: NEW - YOLOv8 &#x1f680; in PyTorch > ONNX > OpenVINO > CoreML > TFLite 其余文件由代码生成。 数据集下载地址&#xff1a;Frui…

使用NVM管理多个版本的node.js

1、nvm介绍&#xff1a; nvm全英文也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm是node.js版本管理工具&#xff0c;为了解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js 2、下载nvm地址&#xff1a; https://d…

Mybatis如何执行批量操作

文章目录 Mybatis如何执行批量操作使用foreach标签 使用ExecutorType.BATCH如何获取生成的主键 Mybatis如何执行批量操作 使用foreach标签 foreach的主要用在构建in条件中&#xff0c;它可以在SQL语句中进行迭代一个集合。foreach标签的属性主要有item&#xff0c;index&…

iPhone苹果手机如何将词令网页添加到苹果iPhone手机桌面快捷打开?

iPhone苹果手机如何将词令网页添加到苹果iPhone手机桌面快捷打开&#xff1f; 1、在iPhone苹果手机上找到「Safari浏览器」,并点击打开&#xff1b; 2、打开Safari浏览器后&#xff0c;输入词令官方网站地址&#xff1a;ciling.cn ; 3、打开词令官网后&#xff0c;点击Safari…

Maven的配置亲测有效

文章目录 前言一、maven网址二、操作步骤三.配置环境变量四.配置本地仓库五.找到mirror 和配置JDK六.胜利七.提醒⏰;总结 前言 &#xff08;我讲一下什么是maven&#xff0c;不想看跳到下一步就行了&#xff0c;也没必要看&#xff09; Maven&#xff08;Apache Maven&#x…

使用策略模式彻底消除if-else

文章目录 使用策略模式彻底消除if-else1. 场景描述2. if-else方式3. 策略模式 使用策略模式彻底消除if-else 如果一个对象有很多的行为&#xff0c;如果不用恰当的模式&#xff0c;这些行为就只好使用多重的条件选择语句来实现&#xff0c;这样会显得代码逻辑很臃肿&#xff0c…

【广州华锐视点】机械零件拆装VR仿真教学系统

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐走进我们的生活。在教育领域&#xff0c;VR技术的应用也日益广泛&#xff0c;为学生提供了更加生动、直观的学习体验。广州华锐视点开发的机械零件拆装VR仿真教学系统作为一种新兴的教学方式&…

Vision Pro即将量产之际,苹果还是放不下中国供应链

发布半年后&#xff0c;苹果口中的“革命性新产品”Vision Pro终于有了新消息。 图源&#xff1a;苹果 根据多家消费电子供应链公司核心人士消息&#xff0c;苹果计划于12月正式量产Vision Pro&#xff0c;首批备货40万台左右&#xff0c;2024年的销量目标为100万台&#xff0…

网络篇---第九篇

系列文章目录 文章目录 系列文章目录前言一、说说TCP/IP四层网络模型二、说说域名解析详细过程?三、 IP 地址分为几类,每类都代表什么,私网是哪些?四、说说TCP 如何保证可靠性的?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家…

W1R3S

信息收集 主机发现 利用nmap -sn参数进行主机发现&#xff0c;该参数是当发现存活主机的时候&#xff0c;不进行端口的探测&#xff0c;其中的n并不是network的含义&#xff0c;而是not port的意思&#xff01; nmap -sn 192.168.217.0/24 -oA ./hosts 这种方式和arp-scan -…

华为OD机试真题-素数之积-2023年OD统一考试(C卷)

题目描述: RSA加密算法在网络安全世界中无处不在,它利用了极大整数因数分解的困难度,数据越大,安全系数越高,给定一个32位正整数,请对其进行因数分解,找出是哪两个素数的乘积。 输入描述: 一个正整数num 0 < num <= 2147483647 输出描述: 如果成功找到,以单个空…

JOSEF约瑟 DY-34 型电压继电器,15-30V 柜内安装,板前接线

DY-30系列电压继电器 DY-32电压继电器&#xff1b; DY-36电压继电器&#xff1b; DY-33电压继电器&#xff1b; DY-37电压继电器&#xff1b; DY-34电压继电器&#xff1b; DY-38电压继电器&#xff1b; DY-31电压继电器&#xff1b; DY-35电压继电器&#xff1b; DY-32/60C电压…

c语言-浅谈指针(4)

文章目录 1.回调函数概念举例 2.qsort函数qsort的使用 3.通过冒泡排序来模拟qsort函数排序int类型排序结构体类型 这是指针最后一篇了喔&#xff0c;完结撒花 ! 前三篇&#xff1a; 浅谈指针&#xff08;1&#xff09;http://t.csdnimg.cn/JTRjW 浅谈指针&#xff08;2&#xf…

GROM gorm.DB 对象剖析

文章目录 1.GORM 简介2.gorm.DB 简介2.1 定义2.2 初始化2.3 查询方法2.4 事务支持2.5 模型关联2.6 钩子&#xff08;Hooks&#xff09;2.7 自定义数据类型 3.为什么不同请求可以共用一个 gorm.DB 对象&#xff1f;4.链式调用与方法5.小结参考文献 1.GORM 简介 GORM 是一个流行…

社区工作者在哪里啊?真救命了

社区工作者&#xff0c;每天各种写材料啊啊啊&#xff01;&#xff01; 有时候真的写麻掉了啊&#xff0c;家人们&#xff0c;太难了&#xff0c;谁懂啊&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 这个好东西真的救我大命啊&#xff0c;只要输入关键词和…

linux基础五:linux 系统(进程状态2:)

linux 系统 一.进程状态&#xff1a;1.睡眠状态(sleep)&#xff1a;2.磁盘休眠状态(disk sleep)&#xff1a;3.停止状态(stoped --- T)&#xff1a;4.死亡状态&#xff1a;5.控制状态&#xff08;t&#xff09; 二.僵尸进程和孤儿进程&#xff1a;1.僵尸状态&#xff1a;2.孤儿…

Redis:缓存问题及解决——缓存穿透、缓存击穿、缓存雪崩

缓存穿透 问题描述 当系统中引入redis缓存后&#xff0c;一个请求进来后&#xff0c;会先从redis缓存中查询&#xff0c;缓存有就直接返回&#xff0c;缓存中没有就去db中查询&#xff0c;db中如果有就会将其丢到缓存中&#xff0c;但是有些key对应数据在db中并不存在&#x…

管理员配置Jupterhub

在Ubuntu上演示如何部署R语言环境&#xff0c;包括 posit的已经编译了一些R的安装 系统已经装了R&#xff0c;我额外编译的R如何让大家都能用到 如何配置RStudio jupyterhub的配置和使用 管理员如何配置jupyterhub 用户如何配置自己的jupyter环境 Ubuntu上的R部署 这一次…

后端防止重复提交相同数据处理方式(Redis)

使用AOP注解处理接口幂等性&#xff0c;默认禁止同一用户在上次提交未果后10秒内又重复提交 在原先的sameUrlData的注解上进行了copy新建优化&#xff0c;使用redis去setnx的参数视项目使用点而调整&#xff0c;不一定是每个项目都适合这种取参形式。 源码如下: package com…