Java 8 Stream API详解
Stream API是Java 8引入的重要特性,它提供了一种高效的处理集合的方式。Stream API允许我们以声明式的方式处理数据,使代码更加简洁易读。
什么是Stream?
Stream是Java 8中引入的一个新的抽象概念,它代表了一个元素序列,支持各种操作以产生所需的结果。Stream操作可以分为两大类:
- 中间操作(Intermediate operations):返回一个新的Stream,如filter、map等
- 终端操作(Terminal operations):返回一个非Stream结果,如collect、forEach等
Stream的创建方式
我们可以通过以下几种方式创建Stream:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
// 1. 通过集合创建
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream1 = list.stream();
// 2. 通过数组创建
String[] array = {"a", "b", "c"};
Stream<String> stream2 = Arrays.stream(array);
// 3. 通过Stream.of()创建
Stream<String> stream3 = Stream.of("a", "b", "c");
// 4. 创建无限流
Stream<Integer> stream4 = Stream.iterate(0, n -> n + 2);
Stream<Double> stream5 = Stream.generate(Math::random);
}
}
Stream的中间操作
中间操作会返回一个新的Stream,允许我们链式调用多个操作:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamIntermediateOperations {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");
// filter - 过滤元素
List<String> filtered = list.stream()
.filter(s -> s.length() > 5)
.collect(Collectors.toList());
System.out.println("过滤后: " + filtered); // [banana, cherry, elderberry]
// map - 转换元素
List<Integer> lengths = list.stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println("长度: " + lengths); // [5, 6, 6, 4, 10]
// sorted - 排序
List<String> sorted = list.stream()
.sorted()
.collect(Collectors.toList());
System.out.println("排序后: " + sorted); // [apple, banana, cherry, date, elderberry]
// distinct - 去重
List<String> distinct = Arrays.asList("a", "b", "a", "c", "b")
.stream()
.distinct()
.collect(Collectors.toList());
System.out.println("去重后: " + distinct); // [a, b, c]
}
}
Stream的终端操作
终端操作会触发Stream的处理,并返回一个非Stream结果:
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
public class StreamTerminalOperations {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");
// forEach - 遍历元素
System.out.println("遍历元素:");
list.stream().forEach(System.out::println);
// collect - 收集结果
List<String> collected = list.stream()
.filter(s -> s.startsWith("a"))
.collect(Collectors.toList());
System.out.println("以a开头的元素: " + collected); // [apple]
// count - 计算元素数量
long count = list.stream()
.filter(s -> s.length() > 5)
.count();
System.out.println("长度大于5的元素数量: " + count); // 3
// findFirst - 查找第一个元素
Optional<String> first = list.stream()
.filter(s -> s.length() > 5)
.findFirst();
System.out.println("第一个长度大于5的元素: " + first.orElse("无")); // banana
// reduce - 归约操作
Optional<String> reduced = list.stream()
.reduce((s1, s2) -> s1 + ", " + s2);
System.out.println("归约结果: " + reduced.orElse("无")); // apple, banana, cherry, date, elderberry
}
}
Stream的并行处理
Stream API还支持并行处理,可以通过parallel()方法将顺序流转换为并行流:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamParallelExample {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 并行处理
List<Integer> parallelResult = list.parallelStream()
.map(n -> n * 2)
.collect(Collectors.toList());
System.out.println("并行处理结果: " + parallelResult); // [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
}
}
Stream API的优势
- 代码简洁:使用Stream API可以用更少的代码实现相同的功能
- 可读性高:声明式的编程风格使代码更易读
- 并行处理:内置支持并行处理,提高性能
- 函数式编程:结合Lambda表达式,支持函数式编程风格
总结
Stream API是Java 8中引入的强大特性,它为我们提供了一种简洁、高效的处理集合的方式。通过Stream API,我们可以以声明式的方式处理数据,使代码更加简洁易读。同时,Stream API还支持并行处理,可以充分利用多核CPU的优势,提高处理大量数据时的性能。
在实际开发中,我们应该充分利用Stream API的优势,将其应用到合适的场景中,以提高代码质量和开发效率。
评论