Java Stream 是 Java 8 引入的一种用于处理数据集合的 API,提供了声明式的方式进行数据处理。它能够支持函数式编程风格,极大地简化了集合操作,提高了代码的可读性和可维护性。
for
循环的外部迭代,Stream 采用内部迭代,更易优化。parallelStream()
可进行并行计算,提高性能。List list = Arrays.asList("apple", "banana", "cherry");
Stream stream = list.stream();
String[] array = {"dog", "cat", "fish"};
Stream stream = Arrays.stream(array);
Stream.of()
创建Stream stream = Stream.of(1, 2, 3, 4, 5);
Stream.iterate()
创建无限流Stream stream = Stream.iterate(0, n -> n + 2).limit(10);
Stream.generate()
创建Stream stream = Stream.generate(Math::random).limit(5);
Stream 主要包含 中间操作(Intermediate Operation)和 终端操作(Terminal Operation)。
中间操作不会立即执行,而是等到终端操作触发。
filter()
- 过滤List numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream().filter(n -> n % 2 == 0).forEach(System.out::println);
map()
- 转换List words = Arrays.asList("java", "stream", "api");
words.stream().map(String::toUpperCase).forEach(System.out::println);
flatMap()
- 扁平化List> nestedList = Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4));
nestedList.stream().flatMap(Collection::stream).forEach(System.out::println);
distinct()
- 去重Stream.of(1, 2, 2, 3, 4, 4).distinct().forEach(System.out::println);
sorted()
- 排序Stream.of(3, 1, 4, 2).sorted().forEach(System.out::println);
limit()
和 skip()
- 限制和跳过Stream.of(1, 2, 3, 4, 5).limit(3).forEach(System.out::println);
Stream.of(1, 2, 3, 4, 5).skip(2).forEach(System.out::println);
终端操作触发流计算,并返回结果。
forEach()
- 遍历Stream.of("A", "B", "C").forEach(System.out::println);
collect()
- 收集结果List list = Stream.of("apple", "banana", "cherry").collect(Collectors.toList());
count()
- 统计个数long count = Stream.of(1, 2, 3, 4).count();
reduce()
- 归约计算Optional sum = Stream.of(1, 2, 3, 4).reduce(Integer::sum);
allMatch()
、anyMatch()
、noneMatch()
- 匹配boolean allEven = Stream.of(2, 4, 6).allMatch(n -> n % 2 == 0);
boolean anyEven = Stream.of(1, 3, 5).anyMatch(n -> n % 2 == 0);
boolean noneEven = Stream.of(1, 3, 5).noneMatch(n -> n % 2 == 0);
并行流使用 Fork/Join 框架进行并行计算,提高性能。
List numbers = IntStream.rangeClosed(1, 100).boxed().collect(Collectors.toList());
numbers.parallelStream().forEach(System.out::println);
Stream 主要用于 无副作用 的计算,应避免修改外部变量。
List list = new ArrayList<>(Arrays.asList(1, 2, 3));
list.stream().map(n -> n * 2).collect(Collectors.toList());
并行流适用于 大数据量 场景,小数据量可能会带来额外的线程管理开销。
流一旦执行终端操作,就不能再次使用。
Stream stream = Stream.of("A", "B", "C");
stream.forEach(System.out::println);
// 再次使用会抛异常
// stream.forEach(System.out::println);
Java Stream 提供了一种强大而简洁的方式来处理数据集合,支持 链式调用、惰性计算 和 并行处理。结束