Java Stream API 自 Java 8 引入以来,已经成为现代 Java 编程不可或缺的一部分。它简化了集合的操作,使代码更具可读性和表达力。本篇文章将为大家分享一些 Java Stream 的使用技巧,帮助你在日常开发中更加高效地使用 Stream。
1. 使用 filter 精确筛选数据
filter 是 Stream 的核心方法之一,用于对数据流进行条件筛选。例如:
List<String> names = List.of("Alice", "Bob", "Charlie", "David");
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
System.out.println(filteredNames); // 输出:[Alice]
2. 利用 map 进行数据转换
map 方法可以将数据从一种形式转换为另一种形式。以下是将字符串列表转换为其长度的示例:
List<String> names = List.of("Alice", "Bob", "Charlie");
List<Integer> nameLengths = names.stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println(nameLengths); // 输出:[5, 3, 7]
3. 用 flatMap 处理嵌套集合
当你需要处理嵌套集合时,flatMap 是非常有用的。例如:
List<List<Integer>> nestedList = List.of(
List.of(1, 2, 3),
List.of(4, 5, 6),
List.of(7, 8, 9)
);
List<Integer> flatList = nestedList.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
System.out.println(flatList); // 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9]
4. reduce 实现聚合操作
reduce 方法用于将流中的元素合并为单一结果。例如,对列表中的数字求和:
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
int sum = numbers.stream()
.reduce(0, Integer::sum);
System.out.println(sum); // 输出:15
5. collect 收集数据到各种集合
collect 是 Stream 终端操作中最常用的方法之一,用于将流中的元素收集到集合中:
Set<String> uniqueNames = names.stream()
.collect(Collectors.toSet());
System.out.println(uniqueNames);
或者,将结果收集到自定义的数据结构中:
Map<String, Integer> nameLengthMap = names.stream()
.collect(Collectors.toMap(name -> name, String::length));
System.out.println(nameLengthMap); // 输出:{Alice=5, Bob=3, Charlie=7}
6. 利用 sorted 排序数据
sorted 方法可以对流中的元素进行排序。例如:
List<String> sortedNames = names.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(sortedNames); // 输出:[Alice, Bob, Charlie]
还可以进行自定义排序:
List<String> reverseSortedNames = names.stream()
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList());
System.out.println(reverseSortedNames); // 输出:[Charlie, Bob, Alice]
7. 并行流提升性能
对于大规模数据处理,可以使用并行流来提升性能:
List<Integer> largeList = IntStream.range(0, 1000000).boxed().collect(Collectors.toList());
long startTime = System.nanoTime();
long count = largeList.parallelStream()
.filter(num -> num % 2 == 0)
.count();
long endTime = System.nanoTime();
System.out.println("Count: " + count);
System.out.println("Time taken: " + (endTime - startTime) + " ns");
需要注意的是,并行流的性能提升取决于具体场景,使用时需谨慎。
8. 避免副作用,确保流操作的纯粹性
Stream 操作最好是无副作用的,避免在 forEach 或其他中间操作中修改外部状态。例如,以下写法可能引发意外错误:
List<String> result = new ArrayList<>();
names.stream()
.filter(name -> name.startsWith("A"))
.forEach(result::add); // 可能引发并发问题
推荐的方式是使用 collect 来收集结果:
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
总结
本文介绍了一些 Java Stream API 的使用技巧,包括 filter、map、flatMap、reduce、collect 等常用操作,以及并行流和流操作的最佳实践。掌握这些技巧,将大大提升你的开发效率和代码质量。如果你还没有在项目中深入使用 Stream,不妨尝试将其引入日常开发,享受其带来的便利与强大功能。
1424

被折叠的 条评论
为什么被折叠?



