Java8新特性Stream

Stream 是 Java 8 引入的一种新的抽象,用于处理集合类 (Collection) 的数据。Stream 并不存储数据,而是按需计算数据。Stream 操作有两个重要特性:
  1. 流水线操作 (Pipelining):Stream 操作可以链式调用,形成一个流水线,这些操作既可以是中间操作(intermediate operation),也可以是终端操作(terminal operation)。
  2. 内部迭代 (Internal Iteration):不同于集合类的外部迭代 (external iteration),Stream 使用内部迭代,通过底层的迭代器实现。

Stream 的优点

  1. 简洁性:Stream API 提供了声明性的方法链来处理数据,这使得代码更简洁、更易读。
  2. 易于并行化:Stream API 提供了简单的并行化处理数据的方式,通过 parallelStream 可以轻松实现并行计算,提高处理性能。
  3. 函数式编程风格:Stream API 支持函数式编程,允许使用 Lambda 表达式和方法引用,减少了样板代码。
  4. 延迟执行:中间操作是惰性求值的,只有在终端操作执行时才会计算,优化了性能。
  5. 更高的抽象层次:Stream API 提供了一种更高层次的数据处理抽象,使得代码更具表达力和可维护性。

用途

Stream API 主要用于对集合数据进行操作,比如过滤、排序、映射、归约等。它提供了一种函数式编程的风格,使代码更简洁、易读、可维护。常见用途包括:

  • 过滤 (Filtering):从集合中筛选出符合条件的元素。
  • 映射 (Mapping):将集合中的每个元素映射成另一种形式。
  • 归约 (Reduction):将集合中的元素组合成一个值。
  • 收集 (Collecting):将处理后的数据转换为其他集合形式。
  • 统计 (Statistics):对数据进行统计计算,如计数、求和、平均值等。

常用的 Stream 操作示例:

1. 创建 Stream
List<String> list = Arrays.asList("a", "b", "c", "d");// 从集合创建 Stream
Stream<String> stream = list.stream();// 从数组创建 Stream
Stream<String> stream = Stream.of("a", "b", "c", "d");
2. 中间操作 (Intermediate Operations)

中间操作会返回一个新的 Stream,它们是惰性求值的,只有在终端操作执行时才会执行。

// 过滤
Stream<String> filteredStream = stream.filter(s -> s.startsWith("a"));// 映射
Stream<String> mappedStream = stream.map(String::toUpperCase);// 排序
Stream<String> sortedStream = stream.sorted();// 去重
Stream<String> distinctStream = stream.distinct();// 排序
Stream<String> sortedStream = stream.sorted();
Stream<String> sortedByComparator = stream.sorted((s1, s2) -> s2.compareTo(s1));
3. 终端操作 (Terminal Operations)

终端操作会触发 Stream 的计算,并生成一个结果或副作用。

// 收集
List<String> collectedList = stream.collect(Collectors.toList());// 统计
long count = stream.count();// 查找
Optional<String> firstElement = stream.findFirst();//reduce:归约操作,将元素组合成一个值
Optional<String> concatenated = stream.reduce((s1, s2) -> s1 + s2);

代码案例

案例 1:过滤和映射
List<String> strings = Arrays.asList("apple", "banana", "orange", "apple", "mango");List<String> result = strings.stream()        //获取stream对象.filter(s -> s.startsWith("a"))       //过滤,检查列表中是否以“a”开头,满足条件保留到流中.map(String::toUpperCase)             //映射,将流中每个字符串转换为大写.collect(Collectors.toList());        //收集,将流中的元素收集到一个list中System.out.println(result);  // 输出:[APPLE, APPLE]
案例 2:排序和去重
 List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);List<Integer> result = numbers.stream().distinct()                            //去重.sorted()                              //排序.collect(Collectors.toList());System.out.println(result);  // 输出:[2, 3, 5, 7]
案例 3:归约操作
 List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);int sum = numbers.stream().reduce(0, Integer::sum);   //reduce:归约操作,将元素组合成一个值System.out.println(sum);  // 输出:15
案例 4:分组操作
List<String> strings = Arrays.asList("apple", "banana", "orange", "apple", "mango");Map<String, Long> result = strings.stream().collect(Collectors.groupingBy(s -> s, Collectors.counting()));//终端操作,收集 使用Collectors.groupingBy()方法来收集流中的元素。// 这个方法接受两个参数:一个是分类函数(在这里是s -> s,表示使用字符串本身作为键)// 另一个是下游的收集器(在这里是Collectors.counting(),用于计算每个键的出现次数)。System.out.println(result);  // 输出:{orange=1, banana=1, apple=2, mango=1}
案例 5:并行流
List<String> strings = Arrays.asList("apple", "banana", "orange", "apple", "mango");List<String> result = strings.parallelStream()   //并行处理集合中的数据,适用与大规模的计算、数据转换、过滤等操作.filter(s -> s.startsWith("a")).map(String::toUpperCase).sorted().collect(Collectors.toList());System.out.println(result);  // 输出:[APPLE, APPLE]
案例 6:生成数列
List<Integer> numbers = IntStream.range(1, 10)   //创建了一个从1到9的整数序列的IntStream.boxed()    //将IntStream中的原始类型int转换成Integer对象的Stream.collect(Collectors.toList());System.out.println(numbers);  // 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9]

案例 7:字符串拼接

List<String> strings = Arrays.asList("apple", "banana", "orange");String result = strings.stream().collect(Collectors.joining(", "));   //字符串拼接System.out.println(result);  // 输出:apple, banana, orange

注意事项

1.排序 stream.sorted()
Stream<String> sortedStream = stream.sorted();
Stream<String> sortedByComparator = stream.sorted((s1, s2) -> s2.compareTo(s1));
  1. 无参的 sorted():元素按照它们的自然顺序排序。如果你的元素是数字或字符串等基本类型,它们将按照自然数值或字典顺序排序。如果你的元素是对象,它们将按照 Comparable 接口中定义的顺序排序。

  2. 带Comparator的 sorted():元素按照你提供的 Comparator 排序。这允许你定制排序逻辑,例如,你可以按字符串长度排序、按某个属性的逆序排序等。

2.中间操作 (Intermediate Operations) 和 终端操作 (Terminal Operations) 的区别
  • 中间操作:
    • 返回一个新的 Stream。
    • 惰性求值:中间操作本身不会触发实际的计算,只有在终端操作执行时才会计算。
    • 例子:filter, map, flatMap, distinct, sorted, limit, skip, peek。
  • 终端操作:
    • 触发 Stream 的计算,并生成结果。
    • 不是惰性求值,一旦调用终端操作,整个 Stream 的计算就会执行。
    • 终端操作会关闭 Stream,之后不能再对其进行操作。
    • 例子:forEach, toArray, reduce, collect, min, max, count, anyMatch, allMatch, noneMatch, findFirst, findAny。

转载自开思通智网:https://www.opensnn.com/os/article/10000908

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

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

相关文章

springboot项目的打包问题(常用)

在java的日常开发中&#xff0c;离不开项目的打包&#xff0c;怎么将项目打包&#xff0c;并部署到服务器&#xff0c;这是每一个java程序猿都需要会的知识点&#xff0c;我根据自己的经验写这篇文章&#xff0c;希望可以帮助到有需要的人。 知识铺垫&#xff1a;在java项目中…

第十五站:Java琥珀——持续集成与交付的自动化之路

Java作为一种广泛使用的编程语言&#xff0c;它的生态系统非常庞大和成熟&#xff0c;其中包括了持续集成与持续交付&#xff08;CI/CD&#xff09;的工具&#xff0c;这些工具对于现代软件开发至关重要。下面我将结合Java源代码&#xff0c;简要介绍Jenkins和GitLab CI/CD如何…

Compiled blocks

目录 一&#xff0c;编译块 Compiled Block 二&#xff0c;编译循环 三&#xff0c;调用编译块 Invoke 四&#xff0c;Tips and notes 一&#xff0c;编译块 Compiled Block 在几何体网络内&#xff0c;可将网络的一部分放入编译块&#xff08;compiled block&#xff09;内…

jenkins nginx自动化部署 php项目

在当今快速发展的IT领域&#xff0c;自动化部署已成为提高工作效率和减少错误的关键。Jenkins作为持续集成/持续部署&#xff08;CI/CD&#xff09;的佼佼者&#xff0c;结合Docker容器技术和PHP编程语言&#xff0c;以及Ansible自动化工具&#xff0c;可以实现高效、可靠的自动…

Node.js RESTful API

Node.js RESTful API Node.js,作为一种流行的服务器端JavaScript运行环境,因其轻量级、高效和易于学习的特点,成为了开发RESTful API的优选技术之一。RESTful API是一种广泛使用的Web服务架构风格,它利用HTTP协议的标准方法(如GET、POST、PUT、DELETE)来访问和操作数据。…

开发指南035-刷新待办

这个问题在平台上的难点在于&#xff1a;待办是在门户系统里&#xff0c;待办的处理是在另一个独立的前端工程里&#xff0c;两者是跨域关系。当然这两个系统都是同一个浏览器打开的。跨域页面通讯技术的核心是&#xff1a;消息监听。 1、门户主界面的vue页面的create中挂接消息…

JavaScript 中的 change

什么是 change 事件&#xff1f; change 事件是 HTML 表单元素的一种事件类型&#xff0c;当表单元素的值发生变化并且失去焦点时&#xff0c;该事件会被触发。常见的表单元素包括 <input>、<select> 和 <textarea>。 适用元素 <input>&#xff08;…

基于DeepNLP AI Store真人点评和ShowCase分享社区-AI for Image Generator

来源 quora 社区: https://deepnlpaistore.quora.com/ github: https://rockingdingo.github.io/deepnlp/store/image_generator 内容 DeepNLP AI Store 网址&#xff1a;http://www.deepnlp.org/store/image-generator 网站针对图像生成类别 Image Generator下多个AI工具如 …

Spring MVC数据绑定和响应——复杂数据绑定(一)数组绑定

一、数组绑定的使用场景 在实际开发中&#xff0c;可能会遇到客户端请求需要传递多个同名参数到服务器端的情况&#xff0c;这种情况采用前面讲解的简单数据绑定的方式显然是不合适的。此时&#xff0c;可以使用数组来接收客户端的请求参数&#xff0c;完成数据绑定。 接下来…

CS与MSF的权限互相传递/mimikatz抓取windows 2012明文密码

目录 CS和MSF的简单介绍 Metasploit Cobalt Strike 1、CS权限传递到MSF 2、MSF权限传递到CS 3、使用mimikatz抓取明文密码 通过修改注册表用户重新登录后抓取明文密码 今天的任务是两个 一个是CS与MSF的权限互相传递一个是抓取windows2012的明文密码 那就分别来完成 …

云计算基础技术

云计算基础技术概览 计算类产品主要提供算力&#xff0c;支持业务运行&#xff0c;例如网站、办公软件、数据分析等计算能力&#xff0c;目前典型的产品主要是虚拟化和容器&#xff0c;在公有云上的云主机本质也是虚拟机。网络类产品主要满足资源的网络连通性和隔离&#xff0c…

软考初级网络管理员__软件单选题

1.如下图所示&#xff0c;在IE“Intemet选项”对话框的()选项卡中可指定电子邮件程序。 常规 内容 高级 程序 2.在Excel的A1单元格中输入函数“ROUND(1/3,3)”,按回车键之后&#xff0c;A1中的值为()。 1 1/3 0.34 0.333 3.在输入Word文档过程中&#xff0c;为了防止意…

Pinia的基本用法

Pinia的安装和引入 1.安装Pinia npm install pinia2. 在vue项目的main.js文件中引入pinia import { createApp } from vue import { createPinia } from pinia import App from ./App.vueconst pinia createPinia() const app createApp(App)app.use(pinia) app.mount(#ap…

日志打印中对容器(包括多级容器)的通用输出

在日志打印中&#xff0c;往往有打印一个数组、集合等容器中的每个元素的需求&#xff0c;这些容器甚至可能嵌套起来&#xff0c;如果每个地方都用for循环打印&#xff0c;将会特别麻烦。基于这种需求&#xff0c;作者尝试实现一个通用的打印函数SeqToStr()&#xff0c;将容器序…

线上民族传统服饰商城

摘 要 随着互联网的不断发展和普及&#xff0c;电子商务成为了人们生活中不可或缺的一部分。传统的线下购物方式逐渐被线上购物所取代&#xff0c;人们越来越习惯在互联网上购物。而民族传统服饰作为我国丰富多样的民族文化的重要组成部分&#xff0c;具有独特的艺术价值和商业…

unity VR Interaction Framework 创建新手势

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、新建物体&#xff0c;并添加必要组件二、添加抓取点三、查看手势的可视化样式四、制作新的手势1.点击编辑2.根据需求调节手指关节3.保存手势4. 使用创建的手势5.运行 总结 前言…

等保测评——安全通信网络——安全区域边界

安全通信网络 网络架构 a) 应保证网络设备的业务处理能力满足业务高峰期需要&#xff1b; b) 应保证网络各个部分的带宽满足业务高峰期需要&#xff1b; c) 应划分不同的网络区域&#xff0c;并按照方便管理和控制的原则为各网络区域分配地址&#xff1b; 应核查是否依据重…

远程过程调用协议gRPC及在go环境下的使用

1. 远程过程调用协议 1.1 定义 远程过程调用(Remote Procedure Call&#xff0c;PRC是一种进程间通信技术&#xff0c;它使得程序可以像调用本地函数一样调用远程服务器上的函数。RPC 屏蔽了底层的通信细节&#xff0c;让开发者能够更专注于业务逻辑&#xff0c;而无需关心网络…

无源电压继电器 JDY-1210AW 导轨安装 约瑟JOSEF

系列型号&#xff1a; JDY-1002AW电压继电器&#xff1b;JDY-1002B电压继电器&#xff1b; JDY-1110AW电压继电器&#xff1b;JDY-1110B电压继电器&#xff1b; JDY-1220AW电压继电器&#xff1b;JDY-1220B电压继电器&#xff1b; JDY-1100AW电压继电器&#xff1b;JDY-110…

服务器数据恢复—用raid6阵列磁盘组建raid5阵列如何恢复原raid数据?

服务器存储数据恢复环境&#xff1a; 华为OceanStor 5800存储&#xff0c;该存储中有一组由10块硬盘组建的raid6磁盘阵列&#xff0c;供企业内部使用&#xff0c;服务器安装linux操作系统EXT3文件系统&#xff0c;划分2个lun。 服务器存储故障&#xff1a; 管理员发现存储中rai…