Java Stream:优雅而高效的集合处理

92 阅读2分钟

在Java中,Stream是一种用于处理集合数据的抽象概念。引入于Java 8,Stream提供了一种更为优雅、高效的方式来操作集合,使得代码更简洁、可读性更强,同时充分发挥了多核处理器的性能。

1. 创建Stream

要使用Stream,首先需要有一个数据源,通常是集合(List、Set、Map等)或数组。下面是一些创建Stream的典型方式:

javaCopy code
List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> streamFromList = list.stream();

Set<Integer> set = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5));
Stream<Integer> streamFromSet = set.stream();

Stream<String> streamFromArray = Arrays.stream(new String[]{"one", "two", "three"});

2. 中间操作

Stream支持丰富的中间操作,这些操作可以在数据源上进行筛选、转换、过滤等处理,而不修改原始数据源。典型的中间操作包括:

  • filter:根据指定条件过滤元素
  • map:将元素映射为新的值
  • distinct:去除重复元素
  • sorted:对元素进行排序
javaCopy code
List<String> result = list.stream()
                          .filter(s -> s.length() > 5)
                          .map(String::toUpperCase)
                          .distinct()
                          .sorted()
                          .collect(Collectors.toList());

3. 终端操作

Stream的操作分为中间操作和终端操作。终端操作会触发实际的处理,产生最终的结果。一些常见的终端操作有:

  • forEach:对每个元素执行指定操作
  • collect:将元素收集到一个集合中
  • reduce:通过指定的操作来合并元素
  • count:计算元素个数
javaCopy code
long count = list.stream()
                 .filter(s -> s.startsWith("a"))
                 .count();

4. 并行处理

Stream还提供了并行处理的能力,通过调用parallel()方法可以将串行的Stream转换为并行的Stream。这样可以充分利用多核处理器,提高处理速度。

javaCopy code
List<String> result = list.parallelStream()
                          .filter(s -> s.length() > 5)
                          .collect(Collectors.toList());

5. 优雅而高效

使用Stream的代码通常更为优雅,减少了很多传统集合操作的样板代码,使得程序更易读、易维护。同时,Stream内部采用惰性求值的策略,只有在终端操作时才会进行实际的计算,这种方式更为高效。

总的来说,Java Stream为集合操作提供了一种更现代、更函数式的编程方式。通过利用Stream,我们能够以更简洁的代码实现对集合的处理,同时充分发挥多核处理器的性能,提升程序的效率和可读性。