简介
本教程将探索强大的 Java 流 API,展示如何从各种集合中高效地创建和处理流。开发者将学习转换数据、执行操作以及利用 Java 流的函数式编程能力的基本技巧。
本教程将探索强大的 Java 流 API,展示如何从各种集合中高效地创建和处理流。开发者将学习转换数据、执行操作以及利用 Java 流的函数式编程能力的基本技巧。
Java 流提供了一种强大的方式来处理对象集合,为数据操作提供了一种声明式的方法。流在 Java 8 中引入,它允许开发者用简洁且可读的代码执行复杂的数据处理操作。
Java 中的流具有几个重要特性:
| 特性 | 描述 |
|---|---|
| 函数式 | 支持函数式风格的操作 |
| 延迟求值 | 操作仅在需要时执行 |
| 并行处理 | 可以轻松地并行化数据处理 |
| 非突变性 | 原始数据源保持不变 |
流的源可以是集合、数组或 I/O 通道。
这些操作将一个流转换为另一个流:
filter()map()sorted()这些操作产生一个结果或副作用:
collect()forEach()reduce()List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
.filter(name -> name.startsWith("A"))
.forEach(System.out::println);
流适用于:
虽然流提供了优雅的解决方案,但与传统循环相比,它们可能会有轻微的性能开销。根据你的具体用例明智地选择。
使用 LabEx,你可以通过交互式编码环境练习和掌握 Java 流技术。
List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry");
Stream<String> fruitStream = fruits.stream();
Set<Integer> numbers = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5));
Stream<Integer> numberStream = numbers.stream();
Map<String, Integer> ages = new HashMap<>();
ages.put("Alice", 25);
ages.put("Bob", 30);
// 键的流
Stream<String> nameStream = ages.keySet().stream();
// 值的流
Stream<Integer> ageStream = ages.values().stream();
// 键值对的流
Stream<Map.Entry<String, Integer>> entryStream = ages.entrySet().stream();
| 方法 | 描述 | 示例 |
|---|---|---|
stream() |
默认的集合方法 | list.stream() |
Arrays.stream() |
从数组创建流 | Arrays.stream(array) |
Stream.of() |
从元素创建流 | Stream.of(1, 2, 3) |
Stream.empty() |
创建一个空流 | Stream.empty() |
// 生成随机数流
Stream<Double> randomStream = Stream.generate(Math.random());
// 通过迭代创建流
Stream<Integer> iteratedStream = Stream.iterate(0, n -> n + 2);
.stream()使用 LabEx,你可以在交互式编码环境中探索和实践这些流创建技术。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<Integer> nameLengths = names.stream()
.map(String::length)
.collect(Collectors.toList());
| 操作 | 描述 | 示例 |
|---|---|---|
collect() |
收集流中的元素 | stream.collect(Collectors.toList()) |
forEach() |
对每个元素执行操作 | stream.forEach(System.out::println) |
reduce() |
将流规约为单个值 | stream.reduce(0, Integer::sum) |
List<String> sortedNames = names.stream()
.sorted()
.collect(Collectors.toList());
Map<Integer, List<String>> namesByLength = names.stream()
.collect(Collectors.groupingBy(String::length));
List<Integer> processedNumbers = numbers.parallelStream()
.map(n -> n * 2)
.collect(Collectors.toList());
| 收集器 | 用途 | 示例 |
|---|---|---|
toList() |
转换为列表 | stream.collect(Collectors.toList()) |
toSet() |
转换为集合 | stream.collect(Collectors.toSet()) |
joining() |
连接字符串 | stream.collect(Collectors.joining(", ")) |
使用 LabEx,你可以在实际动手的编码环境中练习并掌握这些流处理技术。
通过掌握流的创建和处理技术,Java 开发者能够编写更简洁、易读且高效的代码。流 API 提供了一种强大的机制来处理集合,能够以最小的复杂度和更高的性能实现复杂的数据操作。