学习 stream 流

Java 8 引入了 Stream API,这是一个处理集合数据的强大工具,它允许你以声明式的方式对数据进行各种操作,如过滤、映射、排序、归约等。Stream 不存储数据,而是像管道一样传输和转换数据元素。你可以将 Stream 看作是高级迭代器,它提供了一种更抽象的方式来遍历和操作数据集。

Stream 的主要特点

  • 管道化(Pipeline):Stream 支持一系列中间操作(如 filtermapsorted)和终端操作(如 forEachcollectreduce)。中间操作返回一个新的流,而终端操作会触发实际的计算,并产生结果。
  • 惰性求值(Lazy Evaluation):只有当执行到终端操作时,才会真正开始处理数据;在此之前,所有的中间操作都只是记录下来要做什么。
  • 并行支持(Parallel Support):Stream 可以很容易地转换为并行流来进行多线程处理,从而可能提高性能,尤其是在处理大量数据时。

创建 Stream

可以从多种来源创建 Stream

  • 集合(Collection): List<T>Set<T> 等可以直接通过 .stream() 或 .parallelStream() 方法得到对应的流。
  • 数组(Array): 使用 Arrays.stream(array) 或 Stream.of(elements...)
  • 文件(File): Files.lines(path) 返回一个包含文件各行文本的流。
  • 自定义生成器(Generator): Stream.generate(Supplier<T>) 和 Stream.iterate(T seed, UnaryOperator<T>) 可用于无限流。

常用的操作

中间操作

  • filter(Predicate<T> predicate):根据给定的条件筛选流中的元素。
  • map(Function<T, R> mapper):将每个元素转换成另一种形式。
  • flatMap(Function<T, Stream<R>> mapper):先映射每个元素为一个新的流,然后把这些流合并成一个流。
  • distinct():去除重复元素。
  • sorted([Comparator<? super T> comparator]):按自然顺序或指定比较器排序。
  • peek(Consumer<? super T> action):主要用于调试,可以查看流中元素而不改变它们。

终端操作

  • forEach(Consumer<? super T> action):对每个元素执行给定的动作。
  • collect(Collector<? super T, A, R> collector):将流的结果收集到某种容器中,比如列表、集合或自定义对象。
  • reduce(BinaryOperator<T> accumulator):累积流中的元素,常用于求和、乘积等聚合运算。
  • count():返回流中元素的数量。
  • anyMatch(Predicate<? super T> predicate)allMatch(Predicate<? super T> predicate)noneMatch(Predicate<? super T> predicate):检查是否满足某些条件。
  • findFirst()findAny():找到第一个或任意一个匹配的元素。

示例代码

下面是一些使用 Stream API 的简单例子:

java
深色版本
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class StreamExample {public static void main(String[] args) {List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");// 打印所有名字的大写形式names.stream().map(String::toUpperCase).forEach(System.out::println);// 过滤出长度大于3的名字,并收集到新的列表中List<String> filteredNames = names.stream().filter(name -> name.length() > 3).collect(Collectors.toList());// 将名字按首字母分组Map<Character, List<String>> groupedByNameInitial = names.stream().collect(Collectors.groupingBy(name -> name.charAt(0)));System.out.println(groupedByNameInitial);}
}

这段代码展示了如何使用 Stream 对字符串列表进行转换、过滤和分组。Stream API 提供了许多有用的方法来简化集合操作,使得代码更加简洁易读。如果你有特定的需求或者想要了解更多信息,请随时提问!

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

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

相关文章

CloudflareSpeedTest优选IP

# 1.下载CloudflareSpeedTest CloudflareST_linux_amd64.tar.gz: https://url53.ctfile.com/f/62655553-1442843278-2c1830?p=7311 (访问密码: 7311) # 2.下载generate_hosts.sh generate_hosts.sh: https://url53.ctfile.com/f/62655553-1442843314-4dcbe5?p=7311 (访问密码…

随笔-处理器微架构-测量最大IPC

目录固定cpu运行频率max_ipc_test.shLSD (Loop Stream Detector)arm固定cpu频率方式 固定cpu运行频率 我的测试环境cpu频率管理是intel_pstate: $ lscpu | grep -i hz Model name: Intel(R) Core(TM) i5-10500 CPU @ 3.10GHz CPU max MHz: …

6、RabbitMQ队列之主题【RabbitMQ官方教程】

在前面的教程中,我们改进了日志系统。我们没有使用只能进行虚拟广播的扇出交换机,而是使用了直接交换机,从而有可能选择性地接收日志。 虽然使用直接交换改进了我们的系统,但它仍然有局限性——它不能基于多个标准进行路由。 在我们的日志系统中,我们可能不仅要根据严重性…

石猴授徒-分支2-穿山大王

1-前面跟着任务跑,注意不要碰到"宫女" 2-在幻阵场景内点击各个NPC,战斗获得5个线索后,再重新点击其它NPC,提交线索。 注意:在归墟幻阵中通过传送门能够较快的移动,节约时间。3-提交5个线索后随机位置出现地洞,点击后可传送至“穿山大王府”。 4-在穿山大王府点…

KingbaseES 数据库备份恢复案例之---sys_rman备份进程异常

KingbaseES 、sys_rman案例说明: 执行sys_rman物理备份时,读取backup.info、backup.info.copy文件失败,sys_rman进程异常,无法正常结束服务,进程无法退出,阻塞新的备份任务。 适用版本:KingbaseES V8R6 一、问题现象 如下所示,sys_rman备份结束时,读取backup.info、ba…

养老服务市场潜力大,如何实现效率提升?——看板软件篇

通过引入看板软件,养老行业可以实现任务管理的可视化、协作的便捷化和资源的优化配置。这不仅提高了管理效率和服务质量,还为老年人提供了更加安全、舒适的养老服务环境。未来,随着技术的不断进步和应用的不断深化,看板软件将在养老行业中发挥更加重要的作用,为养老行业的…

易基因:单细胞WGBS揭示母源蛋白Pramel15调控早期胚胎发育的DNA甲基化重编程机制|NC/IF 14.7

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 哺乳动物的早期胚胎发育会经历重要的表观遗传重编程过程,这一过程需要重置从亲本基因组继承的表观遗传信息,以启动胚胎基因表达程序,而全基因组去甲基化对表观遗传重编程至关重要。哺乳动物基因组在CpG位点…

10个技巧,3分钟教会你github高效寻找开源项目(转)

作为程序员,不论是开发还是学习,肯定会用到开源项目,那么怎么快速在开源网站找到这些项目呢?常用的开源网站有:github 和 giteegithub是全球最大的开源社区,今天就以github为例,演示一下github界面一般来说,优秀的项目,维护会比较频繁,提交数也就会多一点。当然,一个…

Excel中使用VLOOKUP对两个单元格关联

一、背景 exl中需要关联两个Excel,根据主键合并两个单元格数据二、使用方法1、表1---列包含在id、姓名、年龄2、表2---列包含姓名、性别3、期望根据【姓名】列为主键,关联两个表数据,补充在【合并-性别】列 首先新增【合并-性别】列,然后选中期望填充的单元格,再点击2位置…

Redis启动,停止,Redis命令行的操作

一、redis命令1 redis执行了make install后,redis的课执行文件都会自动复制到 /usr/local/bin 目录 2 redis-server redis服务器 3 redis-cli redis命令行客户端 4 redis-benchmark redis性能测试工具 5 redis-check-aof aof文件修复工具 6 r…