java Stream流操作

什么是Stream?

java8新增Stream,配合同版出现的Lambda,为集合(Collection)操作提供了极大的便利。

Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。

0

Strem可以由数组或集合创建,对流的操作由中间操作和终端操作两种。

  中间操作是在数据源上进行的转换操作,每次操作都会返回一个新的Stream实例,以便继续进行操作。

  终端操作是指对Stream进行最终操作的操作,如收集、计算或迭代等。

1)中间操作,可以有多个,每次返回一个新的流,可进行链式操作。

2)终端操作,只能有一个,每次执行完,这个流就结束了,因此只能放在最后。

Stream特点:

1、Stream流不是集合元素,不是数据结构且并不保存数据,主要目的在于计算。

2、代码简洁,函数式编程写出来的代码简洁、意图明确

3、stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。

4、stream不会改变数据源,通常情况下会产生一个新的集合或一个值。

常见的Stream操作

  • 遍历

List<Integer> list = Arrays.asList(7, 6, 9, 3, 8, 2, 1);// 遍历输出符合条件的元素
list.stream().filter(x -> x > 6).forEach(System.out::println); //7 8 9
// 匹配第一个
Optional<Integer> findFirst = list.stream().filter(x -> x > 6).findFirst();
// 匹配任意(适用于并行流)
Optional<Integer> findAny = list.parallelStream().filter(x -> x > 6).findAny();
// 是否包含符合特定条件的元素
boolean anyMatch = list.stream().anyMatch(x -> x > 6);
System.out.println("匹配第一个值:" + findFirst.get()); //7
System.out.println("匹配任意一个值:" + findAny.get()); //8
System.out.println("是否存在大于6的值:" + anyMatch); //trueList<String> names = Arrays.asList("John", "Jane", "Mike");
names.stream().forEach(name -> System.out.println("Hello, " + name));
//Hello, John
//Hello, Jane
//Hello, Mike
  • 映射

map:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。

flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个

/** *例一*使用stream()方法将列表num转换为一个Stream对象。接着,使用map()方法将每个元素映射为它的平方,*并得到新的Stream对象。最后,我们使用collect()方法将映射后的结果收集到一个List中
**/
List<Integer> num = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squares = num.stream().map(n -> n * n).collect(Collectors.toList());
System.out.println(squares);  //[1,4,9,16,25]/***例二*英文字符串数组的元素全部改为大写。整数数组每个元素+3。
**/
String[] strArr = { "abcd", "bcdd", "defde", "fTr" };
List<String> strList = Arrays.stream(strArr).map(String::toUpperCase).collect(Collectors.toList());List<Integer> intList = Arrays.asList(1, 3, 5, 7, 9, 11);
List<Integer> intListNew = intList.stream().map(x -> x + 3).collect(Collectors.toList());System.out.println("每个元素大写:" + strList);  //[ABCD,BCDD,DEFDE,FTR]
System.out.println("每个元素+3:" + intListNew);  //[4,6,8,10,12,14]/***例三*将员工的薪资全部增加1000。
**/
List<Person> personList = new ArrayList<Person>();
personList.add(new Person("Tom", 8900, 23, "male", "New York"));
personList.add(new Person("Jack", 7000, 25, "male", "Washington"));
personList.add(new Person("Lily", 7800, 21, "female", "Washington"));
personList.add(new Person("Anni", 8200, 24, "female", "New York"));
personList.add(new Person("Owen", 9500, 25, "male", "New York"));
personList.add(new Person("Alisa", 7900, 26, "female", "New York"));// 不改变原来员工集合的方式
List<Person> personListNew = personList.stream().map(person -> {Person personNew = new Person(person.getName(), 0, 0, null, null);personNew.setSalary(person.getSalary() + 10000);return personNew;
}).collect(Collectors.toList());
System.out.println("一次改动前:" + personList.get(0).getName() + "-->" + personList.get(0).getSalary());
System.out.println("一次改动后:" + personListNew.get(0).getName() + "-->" + personListNew.get(0).getSalary());// 改变原来员工集合的方式
List<Person> personListNew2 = personList.stream().map(person -> {person.setSalary(person.getSalary() + 10000);return person;
}).collect(Collectors.toList());
System.out.println("二次改动前:" + personList.get(0).getName() + "-->" + personListNew.get(0).getSalary());
System.out.println("二次改动后:" + personListNew2.get(0).getName() + "-->" + personListNew.get(0).getSalary());/***例四*将两个字符数组合并成一个新的字符数组。
**/
List<String> list = Arrays.asList("m,k,l,a", "1,3,5,7");
List<String> listNew = list.stream().flatMap(s -> {// 将每个元素转换成一个streamString[] split = s.split(",");System.out.println("split长度:"+split.length);System.out.println("s长度:"+s.length());System.out.println("s内元素:"+s.toString());Stream<String> s2 = Arrays.stream(split);return s2;
}).collect(Collectors.toList());System.out.println("处理前的集合:" + list);
System.out.println("处理后的集合:" + listNew);

0

  • 过滤

/***使用filter()方法来过滤出长度大于5的元素,得到了新的Stream对象。最后,使用collect()方法将过滤*后的结果收集到一个List中
**/
List<String> words = Arrays.asList("apple", "banana", "orange", "pear", "grape");
List<String> longWords = words.stream().filter(word -> word.length() > 5).collect(Collectors.toList());
System.out.println(longWords);
// [banana, orange]

  • 排序

/***使用stream()方法将列表转换为一个Stream对象。接着,使用sorted()方法将元素按字典序排序,并得*到新的Stream对象。最后,使用collect()方法将排序后的结果收集到一个List中,
**/
List<String> words = Arrays.asList("apple", "banana", "orange", "pear", "grape");
List<String> sortedWords = words.stream().sorted().collect(Collectors.toList());
System.out.println(sortedWords);
// [apple, banana, grape, orange, pear]

  • 去重

/***除去重复元素**/
List<String> names = Arrays.asList("John", "Jane", "John", "Mike", "Mike");
List<String> distinctNames = names.stream().distinct().collect(Collectors.toList());
System.out.println(distinctNames);// 输出:[John, Jane, Mike]

  • 统计操作(count、min、max、sum、average)

List<Integer> numbers = Arrays.asList(2, 4, 6, 8, 10);
long count = numbers.stream().count();
int max = numbers.stream().max(Integer::compareTo).orElse(0);
int min = numbers.stream().min(Integer::compareTo).orElse(0);
int sum = numbers.stream().mapToInt(Integer::intValue).sum();
double average = numbers.stream().mapToDouble(Integer::intValue).average().orElse(0.0);
System.out.println("Count: " + count); // 输出:Count: 5
System.out.println("Max: " + max); // 输出:Max: 10
System.out.println("Min: " + min); // 输出:Min: 2
System.out.println("Sum: " + sum); // 输出:Sum: 30
System.out.println("Average: " + average); // 输出:Average: 6.0

compareTo()会返回数字,如果两个字符串内容相同,会返回0,字符串a大于字符串b,会返回相差的ASCII码的正数,字符串a小于字符串b,会返回相差的ASCII码的负数。

在Java8中,orElse方法是0ptional类中的一个方法,它的作用是当Optional对象中的值为空时,返回一个指定的默认值。

举个例子,假设有一个0ptional对象,它可能包含一个字符串值,也可能是空的。如果我们想要获取这个字符串值,但又不确定它是否为nuli,就可以使用orElse方法。

  例如:

  0ptional optional = 0ptional.ofNullable(str);String result = optional.orElse('default') ;

  这段代码首先创建了一个0ptional对象,其中可能包含一个字符串值。然后我们调用orElse方法,如果这个Optional对象中的值为空,就会返回一个指定的默认值'default',否则就返回0ptional对象中的值。

/***统计员工人数、平均工资、工资总额、最高工资。
**/
List<Person> personList = new ArrayList<Person>();
personList.add(new Person("Tom", 8900, 23, "male", "New York"));
personList.add(new Person("Jack", 7000, 25, "male", "Washington"));
personList.add(new Person("Lily", 7800, 21, "female", "Washington"));// 求总数
Long count = personList.stream().collect(Collectors.counting());
// 求平均工资
Double average = personList.stream().collect(Collectors.averagingDouble(Person::getSalary));
// 求最高工资
Optional<Integer> max = personList.stream().map(Person::getSalary).collect(Collectors.maxBy(Integer::compare));
// 求工资之和
Integer sum = personList.stream().collect(Collectors.summingInt(Person::getSalary));
// 一次性统计所有信息
DoubleSummaryStatistics collect = personList.stream().collect(Collectors.summarizingDouble(Person::getSalary));System.out.println("员工总数:" + count);  //3
System.out.println("员工平均工资:" + average);  //7900
System.out.println("员工工资总和:" + sum);  //23700
System.out.println("员工工资所有统计:" + collect); //DoubleSummaryStatistics{count=3,sum=23700.000009,min=700.880000, average=7900.000808,max=8900.000000}
  • 收集操作

/***使用了collect()方法将列表中的元素连接成一个字符串,使用joining()方法指定连接符。
**/
List<String> names = Arrays.asList("John", "Jane", "Mike");
System.out.println(names); //输出:[John, Jane, Mike]
String joinedNames = names.stream().collect(Collectors.joining(", "));
System.out.println(joinedNames); // 输出:John, Jane, Mike/***Collectors类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors常用于返回列表或字符串
**/
.collect(Collectors.toList()) // 返回列表
.collect(Collectors.joining(", ") // 返回字符串
  • 归集操作

因为流不存储数据,在流中的数据完成处理后,需要将流中的数据重新归集到新的集合里。常用方法有toList、toSet和toMap。

List<Integer> list = Arrays.asList(1, 6, 3, 4, 6, 7, 9, 6, 20);
List<Integer> listNew = list.stream().map(x -> x * x ).collect(Collectors.toList());
Set<Integer> set = list.stream().filter(x -> x % 2 == 0).collect(Collectors.toSet());System.out.println("toList:" + listNew); //[1, 36, 9, 16, 36, 49, 81, 36, 400]
System.out.println("toSet:" + set); //[4,20,6]

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

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

相关文章

004:Direct 2D离屏渲染(Qt中实现)

简介&#xff1a; 用QT开发图像显示的小程序&#xff0c;需要一些标注工具&#xff0c;由于用的是opengl渲染&#xff0c;所以就在内存中进行绘制&#xff0c;然后纹理贴图贴出去&#xff0c;发现Qt绘制的效果太差&#xff0c;且速度一般&#xff0c;于是就想着用direct2d来绘制…

python——第十五天

面向对象和面向对象编程 面向对象编程&#xff1a; C语言是一门面向过程的编程语言&#xff01;&#xff01;&#xff01; 面向对象的编程思想 就是分门别类的一种能力 面向对象的概念 类&#xff1a; 对一类事物的统称 对象&#xff1a; 一类事物中的具体案例 面向对象的…

python之pyqt专栏8-信号与槽4

信号重载 在上一篇python之pyqt专栏7-信号与槽3-CSDN博客&#xff0c;我们知道在自定义信号时&#xff0c;可以设定信号参数数据类型。pyqt还支持信号重载。 信号定义 sendText pyqtSignal([int],[str]) 代码意思是定义重载信号sendText&#xff0c;槽函数的参数可以是int数…

【Vulnhub 靶场】【CEREAL: 1】【困难】【20210529】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/cereal-1,703/ 靶场下载&#xff1a;https://download.vulnhub.com/cereal/Cereal.ova 靶场难度&#xff1a;困难 发布日期&#xff1a;2021年5月29日 文件大小&#xff1a;1.1 GB 靶场作者&#xff1a;Thomas…

postman打开白屏

现状&#xff1a;postman打开白屏如下图 window环境变量&#xff1a; Win R 快捷键打开 sysdm.cpl 增加环境变量&#xff1a; 变量名&#xff1a;POSTMAN_DISABLE_GPU 值&#xff1a;true 重新打开postman

不用第三方软件实现停止windows10/11更新

第一步&#xff1a;打开regedit 1&#xff1a;键盘按下winR输入regedit 2&#xff1a;按下图顺序选择 3&#xff1a;右击settings新建DWORD【32位】值 输入FlightSettingsMaxPauseDays 然后右击修改值选择十进制输入4000代表可以延迟4000天就是10年多 然后打开设置 一直…

网络运维与网络安全 学习笔记2023.11.29

网络运维与网络安全 学习笔记 第三十天 今日更新太晚啦&#xff01;&#xff01;&#xff01; 主要是今天工作时挨了一天骂&#xff0c;服了&#xff0c;下次记得骂的轻一点&#xff01;&#xff01;&#xff01; &#xff08;要不是为了那点微薄的薪资&#xff0c;谁愿意听你…

文件fd【Linux系统编程】

本文是基础IO的第一个部分&#xff0c;基础IO部分将主要讲解以下内容&#xff1a;文件fd 文件系统 软硬链接 操作系统的内存管理 以及 动静态库。本节重点讲解文件fd&#xff0c;其余内容将在后面的博客更新。 一、共识 文件 内容 属性 文件分为打开了的文件和没打开的文件。…

第二证券:股票几点到几点开盘?

作为股民或许投资者&#xff0c;我们都知道股票是每天都有开盘和收盘时间的。但是&#xff0c;关于股票的开盘时间&#xff0c;很多人并不是很清楚&#xff0c;特别是初学者。在本文中&#xff0c;我们将从多个视点分析股票开盘时间&#xff0c;并为大家供给一些有用的信息。 …

血的教训--kail系统免密centos7的坑【高版本ssh免密低版本ssh的坑】

血的教训–kail系统免密centos7的坑【高版本ssh免密低版本ssh的坑】 最近下载了一个2023版本的kail系统&#xff0c;但是经过几次设置免密后&#xff0c;ssh过去一直让提供密码&#xff0c;所以就仔细的分析了一下&#xff0c;果然还是发现了点猫腻 接上一个博客&#xff0c;大…

CSS新手入门笔记整理:CSS边框样式

边框宽度&#xff1a;boder-width 语法 boder-width:像素值&#xff1b; 边框样式&#xff1a;boder-style 语法 boder-style:取值&#xff1b; 属性值 说明 none 无样式 dashed 虚线 solid 实线 边框颜色&#xff1a;boder-color 语法 boder-color:色值&#xf…

Mysql之子查询(知识点+例题)

Mysql之子查询<知识点例题> 什么是子查询案例分析案例分析子查询的分类单行子查询子查询中的空值问题题目练习题目一题目二题目三题目四题目五补充&#xff1a;聚合函数与GROUP BY的使用关系 CASE表达式&#xff08;子查询中的运用&#xff09;简单CASE表达式搜索CASE表达…

电脑突然死机怎么办?教你几招快速拯救

当今社会&#xff0c;电脑成为我们日常生活和工作不可或缺的一部分。然而&#xff0c;有时电脑可能会突然死机&#xff0c;给我们的操作和数据带来不便。那电脑突然死机怎么办呢&#xff1f;本文将介绍解决电脑突然死机的三种方法&#xff0c;通过详细的步骤指南&#xff0c;帮…

类 —— 继承、多重继承

继承 一个类&#xff0c;继承另一个已有的类。&#xff08;在一个已存在的类的基础上建立一个新的类&#xff0c;并拥有其特性&#xff09; 是一个父类&#xff08;基类&#xff09;派生出子类&#xff08;派生类&#xff09;的过程。 派生类往往是基类的具象化&#xff0c;基…

接口测试之测试原则、测试用例、测试流程......

一、接口的介绍 软件测试中&#xff0c;常说的接口有两种&#xff1a;图形用户接口&#xff08;GUI&#xff0c;人与程序的接口&#xff09;、应用程序编程接口&#xff08;API&#xff09;。 接口&#xff08;API&#xff09;是系统与系统之间&#xff0c;模块与模块之间或者…

异常数据检测 | Python实现oneclassSVM模型异常数据检测

支持向量机(SVM)的异常检测 SVM通常应用于监督式学习,但OneClassSVM[8]算法可用于将异常检测这样的无监督式学习,它学习一个用于异常检测的决策函数其主要功能将新数据分类为与训练集相似的正常值或不相似的异常值。 OneClassSVM OneClassSVM的思想来源于这篇论文[9],SVM使用…

unity UGUI中获取点击位置处的URL链接

需求是&#xff0c;我们在一个text组件中像写网页那样写入链接&#xff0c;然后点击这个链接&#xff0c;就能访问配置的网页啥的。比如&#xff1a; <a href"hello">链接文本</a></summary> 最终的效果如下&#xff1a; 图中&#xff0c;image区…

华为智能手表独立导航,一呼即应轻松畅行

PetalMaps 手表独立导航&#xff0c;一声令下唤醒导航&#xff0c;打造了智慧的语音交互唤醒体验功能。导航时&#xff0c;语音播报、变道震动提醒功能&#xff0c;让您尽情体验腕上导航乐趣&#xff0c;同时又能安全抵达目的地。

通过滴滴技术博客:探寻造成此次P0故障的真正原因

2023年11月27日晚至2023年11月28日早晨&#xff0c;滴滴发生了长达12小时的P0级故障&#xff0c;导致滴滴核心业务都受到了影响&#xff0c;比如不显示定位无法打车、滴滴单车无法扫码等问题&#xff0c;期间滴滴进行了多次致歉 目前问题故障已经恢复&#xff0c;根据最新的消息…

Python使用pywebview开发桌面应用:打造现代化、跨平台的用户体验

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在当今科技快速发展的时代&#xff0c;为了提供更好的用户体验&#xff0c;许多应用程序都转向了桌面应用的开发。在Python领域&#xff0c;pywebview是一款优秀的库&#xff0c;它使得用Web技术开发桌面应用变得…