第七章:Java 8新特性
7.2 Stream API
1. Stream API概述
Stream API是Java 8中引入的一个强大的数据处理工具,它允许开发者以声明式的方式处理集合数据。Stream API的核心思想是将数据源(如集合、数组等)转换为一个流(Stream),然后通过一系列的操作(如过滤、映射、排序等)对数据进行处理,最后通过终止操作得到结果。
Stream API的主要特点包括:
- 声明式编程:开发者只需关注“做什么”,而不是“怎么做”。
- 链式调用:多个操作可以串联起来形成一个流水线。
- 内部迭代:Stream API在内部处理迭代过程,无需显式使用循环。
2. Stream的创建
Stream可以通过多种方式创建:
- 从集合创建:通过
Collection.stream()或Collection.parallelStream()方法。List<String> list = Arrays.asList("a", "b", "c"); Stream<String> stream = list.stream(); - 从数组创建:通过
Arrays.stream()方法。String[] array = {"a", "b", "c"}; Stream<String> stream = Arrays.stream(array); - 使用Stream.of():直接通过值创建Stream。
Stream<String> stream = Stream.of("a", "b", "c"); - 无限流:通过
Stream.iterate()或Stream.generate()方法创建无限流。Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 1);
3. Stream的中间操作
中间操作是对Stream进行处理的步骤,返回一个新的Stream,可以链式调用。常见的中间操作包括:
- filter(Predicate
<T>):过滤符合条件的元素。stream.filter(s -> s.startsWith("a")); - map(Function
<T, R>):将元素转换为另一种形式。stream.map(String::toUpperCase); - sorted():对元素进行排序。
stream.sorted(); - distinct():去除重复元素。
stream.distinct(); - limit(long):限制流中元素的数量。
stream.limit(10);
4. Stream的终止操作
终止操作会触发流的处理并返回结果。常见的终止操作包括:
- forEach(Consumer
<T>):对每个元素执行操作。stream.forEach(System.out::println); - collect(Collector
<T, A, R>):将流转换为集合或其他形式。List<String> result = stream.collect(Collectors.toList()); - reduce(BinaryOperator
<T>):将流中的元素归约为一个值。Optional<String> reduced = stream.reduce((s1, s2) -> s1 + s2); - count():返回流中元素的数量。
long count = stream.count(); - anyMatch(Predicate
<T>):检查是否有元素满足条件。boolean anyMatch = stream.anyMatch(s -> s.equals("a"));
5. 并行流
Stream API支持并行处理数据,可以通过parallelStream()方法或parallel()中间操作将流转换为并行流。并行流利用多核处理器提高处理效率。
List<String> list = Arrays.asList("a", "b", "c");
list.parallelStream().forEach(System.out::println);
6. 示例代码
以下是一个完整的Stream API示例,展示如何从集合中过滤、映射并收集结果:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> result = names.stream()
.filter(name -> name.length() > 4)
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(result); // 输出: [ALICE, CHARLIE, DAVID]
7. 注意事项
- Stream是“一次性”的,一旦被消费(终止操作执行),就不能再次使用。
- 中间操作是惰性的,只有在终止操作触发时才会执行。
- 并行流虽然高效,但需要注意线程安全问题。
Stream API极大地简化了集合数据的处理,是Java 8中最重要的新特性之一。通过灵活的组合中间操作和终止操作,可以高效地完成复杂的数据处理任务。
