跟我学java|Stream流式编程——Stream 的中间操作

news2024/12/22 20:42:05

书接上回,继续研究。

过滤操作(filter)

过滤操作(filter)是 Stream API 中的一种常用操作方法,它接受一个 Predicate 函数作为参数,用于过滤 Stream 中的元素。只有满足 Predicate 条件的元素会被保留下来,而不满足条件的元素将被过滤掉。

过滤操作的语法如下:

Stream<T> filter(Predicate<? super T> predicate)

其中,T 表示 Stream 元素的类型,predicate 是一个函数式接口 Predicate 的实例,它的泛型参数和 Stream 元素类型一致。

使用过滤操作可以根据自定义的条件来筛选出符合要求的元素,从而对 Stream 进行精确的数据过滤。

下面是一个示例,演示如何使用过滤操作筛选出一个整数流中的偶数:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<Integer> filteredStream = stream.filter(n -> n % 2 == 0);
filteredStream.forEach(System.out::println); // 输出结果: 2 4

在这个示例中,我们首先创建了一个包含整数的 Stream,并调用 filter() 方法传入一个 Lambda 表达式 n -> n % 2 == 0,表示要筛选出偶数。然后通过 forEach() 方法遍历输出结果。

需要注意的是,过滤操作返回的是一个新的 Stream 实例,原始的 Stream 不会受到改变。这也是 Stream 操作方法的一个重要特点,它们通常返回一个新的 Stream 实例,以便进行链式调用和组合多个操作步骤。

在实际应用中,过滤操作可以与其他操作方法结合使用,如映射(map)、排序(sorted)、归约(reduce)等,以实现更复杂的数据处理和转换。而过滤操作本身的优点在于,可以高效地对大型数据流进行筛选,从而提高程序的性能和效率。

映射操作(map)

映射操作(map)是 Stream API 中的一种常用操作方法,它接受一个 Function 函数作为参数,用于对 Stream 中的每个元素进行映射转换,生成一个新的 Stream。

映射操作的语法如下:

<R> Stream<R> map(Function<? super T, ? extends R> mapper)

其中,T 表示原始 Stream 的元素类型,R 表示映射后的 Stream 的元素类型,mapper 是一个函数式接口 Function 的实例,它的泛型参数分别是原始 Stream 元素的类型和映射后的元素类型。

使用映射操作可以对 Stream 中的元素逐个进行处理或转换,从而获得一个新的 Stream。这个过程通常涉及对每个元素应用传入的函数,根据函数的返回值来构建新的元素。

下面是一个示例,演示如何使用映射操作将一个字符串流中的每个字符串转换为其长度:

Stream<String> stream = Stream.of("apple", "banana", "cherry");
Stream<Integer> mappedStream = stream.map(s -> s.length());
mappedStream.forEach(System.out::println); // 输出结果: 5 6 6

在这个示例中,我们首先创建了一个包含字符串的 Stream,并调用 map() 方法传入一个 Lambda 表达式 s -> s.length(),表示要将每个字符串转换为其长度。然后通过 forEach() 方法遍历输出结果。

需要注意的是,映射操作返回的是一个新的 Stream 实例,原始的 Stream 不会受到改变。这也是 Stream 操作方法的一个重要特点,它们通常返回一个新的 Stream 实例,以便进行链式调用和组合多个操作步骤。

在实际应用中,映射操作可以与其他操作方法结合使用,如过滤(filter)、排序(sorted)、归约(reduce)等,以实现更复杂的数据处理和转换。而映射操作本身的优点在于,可以通过简单的函数变换实现对原始数据的转换,减少了繁琐的循环操作,提高了代码的可读性和维护性。

需要注意的是,映射操作可能引发空指针异常(NullPointerException),因此在执行映射操作时,应确保原始 Stream 中不包含空值,并根据具体情况进行空值处理。

排序操作(sorted)

排序操作(sorted)是 Stream API 中的一种常用操作方法,它用于对 Stream 中的元素进行排序。排序操作可以按照自然顺序或者使用自定义的比较器进行排序。

排序操作的语法如下:

Stream<T> sorted()
Stream<T> sorted(Comparator<? super T> comparator)

第一种语法形式中,sorted() 方法会根据元素的自然顺序进行排序。如果元素实现了 Comparable 接口并且具备自然顺序,那么可以直接调用该方法进行排序。

第二种语法形式中,sorted(Comparator<? super T> comparator) 方法接受一个比较器(Comparator)作为参数,用于指定元素的排序规则。通过自定义比较器,可以对非 Comparable 类型的对象进行排序。

下面是一个示例,演示如何使用排序操作对一个字符串流进行排序:

Stream<String> stream = Stream.of("banana", "apple", "cherry");
Stream<String> sortedStream = stream.sorted();
sortedStream.forEach(System.out::println); // 输出结果: apple banana cherry

在这个示例中,我们首先创建了一个包含字符串的 Stream,并直接调用 sorted() 方法进行排序。然后通过 forEach() 方法遍历输出结果。

需要注意的是,排序操作返回的是一个新的 Stream 实例,原始的 Stream 不会受到改变。这也是 Stream 操作方法的一个重要特点,它们通常返回一个新的 Stream 实例,以便进行链式调用和组合多个操作步骤。

在实际应用中,排序操作可以与其他操作方法结合使用,如过滤(filter)、映射(map)、归约(reduce)等,以实现更复杂的数据处理和转换。排序操作本身的优点在于,可以将数据按照特定的顺序排列,便于查找、比较和分析。

需要注意的是,排序操作可能会影响程序的性能,特别是对于大型数据流或者复杂的排序规则。因此,在实际应用中,需要根据具体情况进行权衡和优化,选择合适的算法和数据结构来提高排序的效率。

截断操作(limit 和 skip)

截断操作(limit和skip)是 Stream API 中常用的操作方法,用于在处理流的过程中对元素进行截断。

  1. limit(n):保留流中的前n个元素,返回一个包含最多n个元素的新流。如果流中元素少于n个,则返回原始流。

  2. skip(n):跳过流中的前n个元素,返回一个包含剩余元素的新流。如果流中元素少于n个,则返回一个空流。

下面分别详细介绍这两个方法的使用。

limit(n) 方法示例:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<Integer> limitedStream = stream.limit(3);
limitedStream.forEach(System.out::println); // 输出结果: 1 2 3

在这个示例中,我们创建了一个包含整数的 Stream,并调用 limit(3) 方法来保留前三个元素。然后使用 forEach() 方法遍历输出结果。

skip(n) 方法示例:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<Integer> skippedStream = stream.skip(2);
skippedStream.forEach(System.out::println); // 输出结果: 3 4 5

在这个示例中,我们创建了一个包含整数的 Stream,并调用 skip(2) 方法来跳过前两个元素。然后使用 forEach() 方法遍历输出结果。

需要注意的是,截断操作返回的是一个新的 Stream 实例,原始的 Stream 不会受到改变。这也是 Stream 操作方法的一个重要特点,它们通常返回一个新的 Stream 实例,以便进行链式调用和组合多个操作步骤。

截断操作在处理大型数据流或需要对数据进行切分和分页显示的场景中非常有用。通过限制或跳过指定数量的元素,可以控制数据的大小和范围,提高程序的性能并减少不必要的计算。

需要注意的是,在使用截断操作时需要注意流的有界性。如果流是无界的(例如 Stream.generate()),那么使用 limit() 方法可能导致程序陷入无限循环,而使用 skip() 方法则没有意义。

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

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

相关文章

搭建Windows版Redis集群

redis集群 Redis单机版安装 链接: Redis官网下载地址 下载完成后解压至指定目录 打开一个 cmd 窗口 使用 cd 命令切换目录到 E:\Redis\Redis 运行&#xff1a; redis-server.exe redis.windows.confRedis集群的安装 1.构建集群节点目录 创建一个redis-cluster目录用于存放…

计算机网络 - 路由器查表过程模拟 C++(2024)

1.题目描述 参考计算机网络教材 140 页 4.3 节内容&#xff0c;编程模拟路由器查找路由表的过程&#xff0c;用&#xff08;目的地址 掩码 下一跳&#xff09; 的 IP 路由表以及目的地址作为输入&#xff0c;为目的地址查找路由表&#xff0c;找出正确的下一跳并输出结果。 1.…

ATA-P系列功率放大器在压电叠堆中的作用是什么

功率放大器在压电叠堆中的作用是为压电叠堆提供足够的电能&#xff0c;使其产生强大的机械振动。以下为您详细介绍一下。 压电叠堆是一种利用压电效应产生振动的器件。通过在叠堆上施加电压&#xff0c;叠堆内部的压电材料会产生机械应变&#xff0c;从而引起叠堆的振动。这种振…

C++的一些书籍整理(个人学习)

UNIX环境高级编程&#xff08;第三版&#xff09; UNXI网络编程卷1 网络编程的笔记 收藏 我会了 一堆书 这个仓 数据库连接池原理介绍常用连接池介绍

7.3 CONSTANT MEMORY AND CACHING

掩模数组M在卷积中的使用方式有三个有趣的属性。首先&#xff0c;M阵列的大小通常很小。大多数卷积掩模在每个维度上都少于10个元素。即使在3D卷积的情况下&#xff0c;掩码通常也只包含少于1000个元素。其次&#xff0c;在内核执行过程中&#xff0c;M的内容不会改变。第三&am…

移动端对大批量图片加载的优化方法(三)

移动端对大批量图片加载的优化方法&#xff08;三&#xff09;Flutter 本篇主要从Flutter开发中可以使用到的对大批量图片加载的优化方法进行整理。 1.合适的图片格式 详情请参考移动端对大批量图片加载的优化方法&#xff08;一&#xff09;。 2.缓存机制 在Flutter中&am…

2023年山东省职业院校技能大赛高职组信息安全管理与评估—内存取证解析

内存取证 1、从内存中获取到用户admin的密码并且破解密码,以Flag{admin,password} 形式提交(密码为 6 位); volatility -f 1.vmem imageinfo 操作系统我们一般取第一个就可以了

vulhub中的Apache SSI 远程命令执行漏洞

Apache SSI 远程命令执行漏洞 1.cd到ssi-rce cd /opt/vulhub/httpd/ssi-rce/ 2.执行docker-compose up -d docker-compose up -d 3.查看靶场是否开启成功 dooker ps 拉取成功了 4.访问url 这里已经执行成功了&#xff0c;注意这里需要加入/upload.php 5.写入一句话木马 &…

Qt实现简单的分割窗口

最近在学习一些关于Qt的新知识&#xff0c;今天来讲述下我学习到的窗口分割&#xff0c;如果有不正确的&#xff0c;大家可以指正哦~ 首先&#xff0c;先看一下实现之后的简单效果吧&#xff01;省的说的天花乱坠&#xff0c;大家却不知道说的是哪个部分。 功能实现 整体demo…

阿里云RDMA通信库XRDMA论文详解

RDMA(remote direct memory access)即远端直接内存访问&#xff0c;是一种高性能网络通信技术&#xff0c;具有高带宽、低延迟、无CPU消耗等优点。RDMA相比TCP在性能方面有明显的优势&#xff0c;但在编程复杂度上RDMA verbs却比TCP socket复杂一个数量级。 开源社区和各大云厂…

如何在iOS手机上查看应用日志

引言 在开发iOS应用过程中&#xff0c;查看应用日志是非常重要的一项工作。通过查看日志&#xff0c;我们可以了解应用程序运行时的状态和错误信息&#xff0c;帮助我们进行调试和排查问题。本文将介绍两种方法来查看iOS手机上的应用日志&#xff0c;并提供相应的操作步骤。 …

Python学习之路——文件部分【书接上回】

一、书接上回 上个博客我说过&#xff0c;为什么最开始的时候一定要将文件内的中文的逗号替换为英文的逗号&#xff0c;接下来&#xff0c;请看&#xff08;其实想一想&#xff0c;感觉没必要&#xff0c;不过也是好的&#xff0c;总要练练手的嘛&#xff09; def func03(st…

Spring——基于注解的AOP配置

基于注解的AOP配置 1.创建工程 1.1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

基于DNA的密码学和隐写术综述

摘要 本文全面调研了不同的脱氧核糖核酸(DNA)-基于密码学和隐写术技术。基于DNA的密码学是一个新兴领域,利用DNA分子的大规模并行性和巨大的存储容量来编码和解码信息。近年来,由于其相对传统密码学方法的潜在优势,如高存储容量、低错误率和对环境因素的抗性,该领域引起…

怎么把图片表格转成word表格?教你简单转换

怎么把图片表格转成word表格&#xff1f;在我们的日常工作中&#xff0c;经常会遇到需要将图片表格转换成Word表格的情况。这样不仅可以方便我们编辑、整理数据&#xff0c;还能提高工作效率。那么&#xff0c;如何将图片表格快速、准确地转换成Word表格呢&#xff1f;下面就为…

openGauss学习笔记-190 openGauss 数据库运维-常见故障定位案例-服务启动失败

文章目录 openGauss学习笔记-190 openGauss 数据库运维-常见故障定位案例-服务启动失败190.1 服务启动失败190.1.1 问题现象190.1.2 原因分析190.1.3 处理办法 openGauss学习笔记-190 openGauss 数据库运维-常见故障定位案例-服务启动失败 190.1 服务启动失败 190.1.1 问题现…

国芯科技荣膺高工智能汽车“年度车规MCU高成长供应商”,加速产品精准化系列化布局

2023年12月13—15日&#xff0c;2023&#xff08;第七届&#xff09;高工智能汽车年会在上海召开&#xff0c;大会以“寻找拐点”为主题&#xff0c;通过超80场主题演讲及多场圆桌对话&#xff0c;为智能汽车赛道参与者「备战2024」提供全方位的决策支持。 作为汽车电子芯片领…

DNS解析原理和k8s DNS 实践

1. 问题背景 1.1 域名解析异常 近期开发的一个功能&#xff0c;需要在k8s集群容器环境中调用公司内部api&#xff0c;api提供了内网域名&#xff0c;解析内网域名异常导致请求超时&#xff0c;因此梳理了下DNS的知识点。 可以先看到下面&#x1f447;这段配置&#xff0c;修…

基于net6的asp.net core webapi项目打包为docker镜像,并推送至私有镜像仓库harbor中

基于net6的asp.net core webapi项目打包为docker镜像&#xff0c;并推送至私有镜像仓库harbor中 0、环境说明1、打包步骤1.1 创建Asp.net core WebApi项目1.2 在Asp.net core WebApi项目根目录下创建Dockerfile文件1.3 在子系统Ubuntu20.04.4中通过docker build生成docker镜像1…

资源分享:GIS插件-海怪工具箱(附下载链接)

工具详情&#xff1a; ArcGIS海怪工具箱&#xff0c;可直接在ArcGIS中安装使用。 功能&#xff1a; 1、按属性编码&#xff1a;根据字段编码&#xff0c;相同的字段值同一个编码&#xff0c;然后依次升序。 可以手动指定编码样式&#xff0c;比如输入1&#xff0c;那么后续编…