自从 Java 8 引入了 Stream API,它已经成为处理集合数据的强大工具。Stream API 提供了一种高效且声明式的方式来处理数据集合,使得代码更加简洁和易读。本文将介绍一些常用的 Stream 方法,并通过示例代码来说明它们的使用方法。
1. filter
- 过滤元素
filter
方法用于过滤出符合特定条件的元素。
示例代码
ini
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(evenNumbers); // 输出: [2, 4, 6]
2. map
- 转换元素
map
方法用于将每个元素转换为另一个形式。
示例代码
ini
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<Integer> nameLengths = names.stream()
.map(name -> name.length())
.collect(Collectors.toList());
System.out.println(nameLengths); // 输出: [5, 3, 7]
3. flatMap
- 展平元素
flatMap
方法用于将多个流合并成一个流。
示例代码
scss
List<List<Integer>> numberLists = Arrays.asList(
Arrays.asList(1, 2),
Arrays.asList(3, 4),
Arrays.asList(5, 6)
);
List<Integer> flatNumbers = numberLists.stream()
.flatMap(list -> list.stream())
.collect(Collectors.toList());
System.out.println(flatNumbers); // 输出: [1, 2, 3, 4, 5, 6]
4. distinct
- 去重
distinct
方法用于去除重复的元素。
示例代码
ini
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
List<Integer> uniqueNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());
System.out.println(uniqueNumbers); // 输出: [1, 2, 3, 4, 5]
5. sorted
- 排序
sorted
方法用于对流中的元素进行排序。
示例代码
ini
List<Integer> numbers = Arrays.asList(5, 3, 2, 4, 1);
List<Integer> sortedNumbers = numbers.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(sortedNumbers); // 输出: [1, 2, 3, 4, 5]
6. limit
- 限制元素数量
limit
方法用于限制流中返回的元素数量。
示例代码
ini
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> limitedNumbers = numbers.stream()
.limit(5)
.collect(Collectors.toList());
System.out.println(limitedNumbers); // 输出: [1, 2, 3, 4, 5]
7. skip
- 跳过元素
skip
方法用于跳过流中的前 n 个元素。
示例代码
ini
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> skippedNumbers = numbers.stream()
.skip(5)
.collect(Collectors.toList());
System.out.println(skippedNumbers); // 输出: [6, 7, 8, 9, 10]
8. forEach
- 遍历元素
forEach
方法用于遍历流中的每个元素。
示例代码
rust
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
.forEach(name -> System.out.println(name));
// 输出:
// Alice
// Bob
// Charlie
9. reduce
- 聚合操作
reduce
方法用于将流中的元素聚合为一个值。
示例代码
ini
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> sum = numbers.stream()
.reduce((a, b) -> a + b);
sum.ifPresent(System.out::println); // 输出: 15
10. collect
- 收集结果
collect
方法用于将流中的元素收集到一个集合或其他容器中。
示例代码
ini
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
String concatenatedNames = names.stream()
.collect(Collectors.joining(", "));
System.out.println(concatenatedNames); // 输出: Alice, Bob, Charlie
11. anyMatch
- 检查是否至少有一个元素匹配条件
anyMatch
方法用于检查流中是否有至少一个元素匹配给定的条件。
示例代码
ini
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
boolean anyStartsWithA = names.stream()
.anyMatch(name -> name.startsWith("A"));
System.out.println(anyStartsWithA); // 输出: true
12. allMatch
- 检查所有元素是否匹配条件
allMatch
方法用于检查流中的所有元素是否都匹配给定的条件。
示例代码
ini
List<Integer> numbers = Arrays.asList(2, 4, 6, 8);
boolean allEven = numbers.stream()
.allMatch(n -> n % 2 == 0);
System.out.println(allEven); // 输出: true
13. noneMatch
- 检查没有元素匹配条件
noneMatch
方法用于检查流中没有任何元素匹配给定的条件。
示例代码
ini
List<Integer> numbers = Arrays.asList(1, 3, 5, 7);
boolean noneEven = numbers.stream()
.noneMatch(n -> n % 2 == 0);
System.out.println(noneEven); // 输出: true
14. findFirst
- 查找第一个元素
findFirst
方法用于查找流中的第一个元素。
示例代码
ini
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Optional<String> first = names.stream()
.findFirst();
first.ifPresent(System.out::println); // 输出: Alice
15. count
- 计算元素数量
count
方法用于计算流中的元素数量。
示例代码
ini
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
long count = numbers.stream()
.count();
System.out.println(count); // 输出: 5
16. max
- 查找最大值
max
方法用于查找流中的最大值。
示例代码
ini
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> max = numbers.stream()
.max(Integer::compare);
max.ifPresent(System.out::println); // 输出: 5
17. min
- 查找最小值
min
方法用于查找流中的最小值。
示例代码
ini
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> min = numbers.stream()
.min(Integer::compare);
min.ifPresent(System.out::println); // 输出: 1
18. peek
- 调试中间操作
peek
方法用于在流的中间操作中进行调试,输出每个元素的信息。
示例代码
ini
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squaredNumbers = numbers.stream()
.peek(System.out::println)
.map(n -> n * n)
.collect(Collectors.toList());
System.out.println(squaredNumbers); // 输出: [1, 4, 9, 16, 25]
19. toArray
- 转换为数组
toArray
方法用于将流中的元素转换为数组。
示例代码
ini
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Integer[] numberArray = numbers.stream()
.toArray(Integer[]::new);
System.out.println(Arrays.toString(numberArray)); // 输出: [1, 2, 3, 4, 5]
20. sum
- 计算总和
sum
方法用于计算流中数值元素的总和。
示例代码
ini
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.mapToInt(Integer::intValue)
.sum();
System.out.println(sum); // 输出: 15
这些方法只是 Stream API 的一部分,但它们已经足够强大,可以处理大多数常见的集合操作。希望这些示例能帮助你更好地理解和使用 Java 8 中的 Stream API。