点击上方“程序员蜗牛g”,选择“设为星标”跟蜗牛哥一起,每天进步一点点
程序员蜗牛g大厂程序员一枚 跟蜗牛一起 每天进步一点点31篇原创内容**公众号
今天,我们将带你探索 Java Stream API 中一些极具魔力的用法,让你的代码更简洁、更高效,同时避免常见的陷阱。
Stream.ofNullable():告别 NullPointerException
不再为 null 头疼!
Java 9 引入了 Stream.ofNullable(),它可以自动忽略 null 值,避免 NullPointerException。
import java.util.*;import java.util.stream.*;
public class StreamDemo { public static void main(String[] args) { List<String> names = Arrays.asList("Alice", null, "Bob", "Charlie", null); List<String> filteredNames = names.stream() .flatMap(Stream::ofNullable) // 直接跳过 null .collect(Collectors.toList());
System.out.println(filteredNames); // [Alice, Bob, Charlie] }}
相比 filter(Objects::nonNull),这种方式更优雅、简洁,Java 直接帮你搞定 null 处理!
Stream.iterate():无限流?当然可以!
动态生成数据流,简直像魔法一样!
如果你需要一个永不终止的偶数序列,只需 Stream.iterate():
Stream.iterate(2, n -> n + 2)
.limit(5) // 只取前 5 个
.forEach(System.out::println); // 2, 4, 6, 8, 10
这个方法非常适用于游戏模拟、数据填充、动态列表等场景。
Collectors.collectingAndThen():流式处理的万能工具
在 collect() 后再进行额外处理,让数据转换更顺滑!
比如计算平均工资并四舍五入:
long averageSalary = employees.stream()
.collect(Collectors.collectingAndThen(
Collectors.averagingDouble(Employee::getSalary),
Math::round // 💡 一步到位
));
不需要写额外代码,一个流式操作就能完成计算和转换。
takeWhile() & dropWhile():精准裁剪数据流
用 Java 9 提供的 takeWhile() 和 dropWhile() 轻松截取集合。
List<Integer> numbers =List.of(1,2,3,4,5,6,7,8);
List<Integer> taken = numbers.stream()
.takeWhile(n -> n <5)// 取出小于 5 的部分
.collect(Collectors.toList());
List<Integer> dropped = numbers.stream()
.dropWhile(n -> n <5)// 丢弃小于 5 的部分
.collect(Collectors.toList());
这在分页处理、批量数据处理、数据分片等场景下尤为实用!
Collectors.teeing():一箭双雕,合并两个收集器结果
Java 12 的 Collectors.teeing() 允许同时执行两个 collect() 操作,并合并结果。
输出示例:
{Max=Optional[8], Min=Optional[1]}
这种方式适用于并行计算、数据统计等场景,避免了额外的 stream() 处理,让代码更加简洁高效!
这些 Java Stream 黑魔法,你学会了吗?赶快在你的项目中实践一下,让你的代码更加简洁高效吧!
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。
关注公众号:woniuxgg,在公众号中回复:笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!