Java中的Stream API进阶使用

Java的Stream API是Java 8引入的一个强大的功能,它允许以声明性方式处理数据集合,例如过滤、映射、排序等。下面是一些Stream API的进阶使用:

  1. 自定义中间操作 :你可以定义自己的中间操作,然后在Stream上使用它。例如,你可以创建一个名为filterNames的操作,它只接受名字长度大于5的字符串。
复制代码

java复制代码

|---|-----------------------------------------------------------------------------------------------------|
| | public static <T> Predicate<T> filterNames(String name) { |
| | return (T t) -> t instanceof String && ((String) t).length() > 5 && ((String) t).contains(name); |
| | } |

然后在Stream上使用它:

复制代码

java复制代码

|---|---------------------------------------------------------------------------|
| | List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave"); |
| | List<String> result = names.stream() |
| | .filter(filterNames("a")) |
| | .collect(Collectors.toList()); |

  1. 终止操作 :除了常见的collect, reduce等终止操作外,你还可以使用其他一些操作,如forEachallMatchanyMatch等。例如,你可以使用allMatch来检查Stream中的所有元素是否满足某个条件:
复制代码

java复制代码

|---|-------------------------------------------------|
| | boolean allPositive = IntStream.range(0, 10) |
| | .allMatch(i -> i > 0); |

  1. 短路操作 :一些Stream操作,如filtermap,支持短路。这意味着如果操作的源是无限的,那么这些操作可以在任何给定的时间点提前终止。这可以用来避免无限循环。例如:
复制代码

java复制代码

|---|----------------------------------------------------------------------------------------|
| | Stream<Integer> numbers = Stream.generate(() -> 1).limit(1000); |
| | List<Integer> result = numbers.filter(n -> n % 2 == 0).collect(Collectors.toList()); |

在这个例子中,如果源Stream是无限的,那么filter操作会在找到第一个偶数时停止,而不是尝试处理所有的数字。

  1. 并行流:并行流允许你在多个线程上同时处理数据。这对于大数据集非常有用,因为它可以显著提高性能。但是要注意,并行流并不总是比顺序流更快。它们在处理大量数据时效果最好。例如:
复制代码

java复制代码

|---|--------------------------------------------------------------------------|
| | List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); |
| | List<Integer> result = numbers.parallelStream() |
| | .filter(n -> n % 2 == 0) |
| | .collect(Collectors.toList()); |

  1. 使用Optional:当你从Stream中获取单个元素时,你应该总是使用Optional。这可以避免NullPointerException。例如:
复制代码

java复制代码

|---|------------------------------------------------|
| | Optional<String> firstName = names.stream() |
| | .findFirst(); |

在这个例子中,如果名字列表为空,firstName将是空的,而不是null。然后你可以使用firstName.isPresent()来检查是否有名字,或者使用firstName.orElse("default")来提供一个默认值。

相关推荐
Joy T36 分钟前
Spring AI 2.0 Agent 进阶:Memory、State 与 Context Engineering 常见技术全景
java·人工智能·后端·spring·agent入门·agent state
估值探索者37 分钟前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘
西柚研究生12345639 分钟前
论文分析17:YOLOv11_UAVNet:无人机航拍图像专用目标检测算法
人工智能·python·深度学习·算法·目标检测
天若有情6731 小时前
C++花式魔改!手写头文件复刻Java语法,彻底打破编码思维定式
java·c++·语言做语言·jac++
沧海一笑-dj1 小时前
【Python】Python学习笔记-初识 Python
python·python安装·python解释器
打工仔折腾 AI1 小时前
FastAPI 从本机到生产服务器:Nginx+Gunicorn+Uvicorn 完整部署实录
人工智能·后端·python·nginx·fastapi·gunicorn
hanchenxing1 小时前
AI 数据管道重构:从函数堆到链式管道的可读性实践
python
2601_962364972 小时前
红外活体模组,Windows 设备安全身份入口解析
windows·安全·电脑
hhzz2 小时前
【OpenCV 入门到精通 10】视频分析与光流跟踪:背景减除与运动检测
人工智能·python·opencv·性能优化
蓝胖的四次元口袋2 小时前
Python基础语法入门
python