Java Stream 流从零到一全指南

1. 什么是 Java Stream?

Java Stream 是 Java 8 引入的一种用于处理数据集合的 API,提供了声明式的方式进行数据处理。它能够支持函数式编程风格,极大地简化了集合操作,提高了代码的可读性和可维护性。

Stream 的核心特性

  • 链式操作:流操作可以串联在一起,避免了传统迭代方式的冗余代码。
  • 惰性求值:只有在终端操作时,流的计算才会执行。
  • 内部迭代:相比于 for 循环的外部迭代,Stream 采用内部迭代,更易优化。
  • 支持并行处理:借助 parallelStream() 可进行并行计算,提高性能。

2. 如何创建 Stream?

2.1 通过集合创建

List list = Arrays.asList("apple", "banana", "cherry");
Stream stream = list.stream();

2.2 通过数组创建

String[] array = {"dog", "cat", "fish"};
Stream stream = Arrays.stream(array);

2.3 通过 Stream.of() 创建

Stream stream = Stream.of(1, 2, 3, 4, 5);

2.4 通过 Stream.iterate() 创建无限流

Stream stream = Stream.iterate(0, n -> n + 2).limit(10);

2.5 通过 Stream.generate() 创建

Stream stream = Stream.generate(Math::random).limit(5);

3. Stream 的操作

Stream 主要包含 中间操作(Intermediate Operation)和 终端操作(Terminal Operation)。

3.1 中间操作(Intermediate)

中间操作不会立即执行,而是等到终端操作触发。

3.1.1 filter() - 过滤
List numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream().filter(n -> n % 2 == 0).forEach(System.out::println);
3.1.2 map() - 转换
List words = Arrays.asList("java", "stream", "api");
words.stream().map(String::toUpperCase).forEach(System.out::println);
3.1.3 flatMap() - 扁平化
List> nestedList = Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4));
nestedList.stream().flatMap(Collection::stream).forEach(System.out::println);
3.1.4 distinct() - 去重
Stream.of(1, 2, 2, 3, 4, 4).distinct().forEach(System.out::println);
3.1.5 sorted() - 排序
Stream.of(3, 1, 4, 2).sorted().forEach(System.out::println);
3.1.6 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);

3.2 终端操作(Terminal)

终端操作触发流计算,并返回结果。

3.2.1 forEach() - 遍历
Stream.of("A", "B", "C").forEach(System.out::println);
3.2.2 collect() - 收集结果
List list = Stream.of("apple", "banana", "cherry").collect(Collectors.toList());
3.2.3 count() - 统计个数
long count = Stream.of(1, 2, 3, 4).count();
3.2.4 reduce() - 归约计算
Optional sum = Stream.of(1, 2, 3, 4).reduce(Integer::sum);
3.2.5 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);

4. 并行流(Parallel Stream)

并行流使用 Fork/Join 框架进行并行计算,提高性能。

List numbers = IntStream.rangeClosed(1, 100).boxed().collect(Collectors.toList());
numbers.parallelStream().forEach(System.out::println);

5. Stream 的最佳实践

5.1 避免修改数据源

Stream 主要用于 无副作用 的计算,应避免修改外部变量。

List list = new ArrayList<>(Arrays.asList(1, 2, 3));
list.stream().map(n -> n * 2).collect(Collectors.toList());

5.2 合理使用并行流

并行流适用于 大数据量 场景,小数据量可能会带来额外的线程管理开销。

5.3 终端操作只能执行一次

流一旦执行终端操作,就不能再次使用。

Stream stream = Stream.of("A", "B", "C");
stream.forEach(System.out::println);
// 再次使用会抛异常
// stream.forEach(System.out::println);

6. 总结

Java Stream 提供了一种强大而简洁的方式来处理数据集合,支持 链式调用惰性计算并行处理。结束

你可能感兴趣的:(JAVA,windows,java,开发语言,流,strem)