Java Stream API 中常用方法的详细介绍,包括你提到的 anyMatch、allMatch、noneMatch 和 findAny,以及其他相关表达式。
1. 中间操作(Intermediate Operations)
中间操作是惰性操作,返回,不会立即执行,只有当遇到终端操作时才会触发计算。
1.1 filter
描述: 用于筛选流中的元素。
参数: 接收一个
Predicate(布尔条件)。返回值: 一个只包含满足条件的元素的新 Stream。
示例:
javaList<Integer> numbers = List.of(1, 2, 3, 4, 5); numbers.stream() .filter(n -> n % 2 == 0) // 筛选偶数 .forEach(System.out::println); // 输出:2, 4
1.2 map
描述: 用于将流中的元素映射为另一种形式。
参数: 接收一个
Function,将元素转换为新的值。返回值: 一个包含转换后元素的新 Stream。
示例:
java复制代码List<String> names = List.of("Alice", "Bob", "Charlie"); names.stream() .map(String::toUpperCase) // 转换为大写 .forEach(System.out::println); // 输出:ALICE, BOB, CHARLIE
1.3 flatMap
描述: 用于将多个子流合并为一个流。
参数: 接收一个
Function,将元素转换为一个 Stream。返回值: 一个新的 Stream,包含所有子流中的元素。
示例:
javaList<List<Integer>> nestedLists = List.of(List.of(1, 2), List.of(3, 4)); nestedLists.stream() .flatMap(List::stream) // 合并子流 .forEach(System.out::println); // 输出:1, 2, 3, 4
1.4 distinct
描述: 去除流中重复的元素。
返回值: 一个包含唯一元素的新 Stream。
示例:
javaList<Integer> numbers = List.of(1, 2, 2, 3, 4, 4); numbers.stream() .distinct() .forEach(System.out::println); // 输出:1, 2, 3, 4
1.5 sorted
描述: 对流中的元素进行排序。
参数: 可选,接受一个
Comparator进行自定义排序。返回值: 一个排序后的 Stream。
示例:
javaList<Integer> numbers = List.of(3, 1, 4, 2); numbers.stream() .sorted() // 默认升序 .forEach(System.out::println); // 输出:1, 2, 3, 4
1.6 limit
描述: 截取流的前
n个元素。参数: 接收一个
long类型的值,表示要截取的元素数量。返回值: 一个包含前
n个元素的新 Stream。示例:
javaList<Integer> numbers = List.of(1, 2, 3, 4, 5); numbers.stream() .limit(3) .forEach(System.out::println); // 输出:1, 2, 3
1.7 skip
描述: 跳过流中的前
n个元素。参数: 接收一个
long类型的值,表示要跳过的元素数量。返回值: 一个包含剩余元素的新 Stream。
示例:
javaList<Integer> numbers = List.of(1, 2, 3, 4, 5); numbers.stream() .skip(2) .forEach(System.out::println); // 输出:3, 4, 5
2. 终端操作(Terminal Operations)
终端操作会触发流的计算,并返回结果。
2.1 forEach
描述: 遍历流中的每个元素并执行指定操作。
参数: 接收一个
Consumer,对元素执行操作。返回值: 无(
void)。示例:
javaList<String> names = List.of("Alice", "Bob", "Charlie"); names.stream() .forEach(System.out::println); // 输出:Alice, Bob, Charlie
2.2 collect
描述: 将流中的元素收集到集合或其他容器中。
参数: 接收一个
Collector,指定收集方式。返回值: 根据收集器的定义返回结果。
示例:
javaList<Integer> numbers = List.of(1, 2, 3, 4, 5); List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); System.out.println(evenNumbers); // 输出:[2, 4]
2.3 count
描述: 返回流中元素的数量。
返回值: 一个
long类型的值,表示元素数量。示例:
javaList<Integer> numbers = List.of(1, 2, 3, 4, 5); long count = numbers.stream() .filter(n -> n % 2 == 0) .count(); System.out.println(count); // 输出:2
2.4 anyMatch
描述: 判断流中是否。
参数: 接收一个
Predicate。返回值: 一个
boolean值。示例:
javaList<Integer> numbers = List.of(1, 2, 3, 4, 5); boolean hasEven = numbers.stream() .anyMatch(n -> n % 2 == 0); System.out.println(hasEven); // 输出:true
2.5 allMatch
描述: 判断流中是否。
参数: 接收一个
Predicate。返回值: 一个
boolean值。示例:
javaList<Integer> numbers = List.of(2, 4, 6); boolean allEven = numbers.stream() .allMatch(n -> n % 2 == 0); System.out.println(allEven); // 输出:true
2.6 noneMatch
描述: 判断流中是否。
参数: 接收一个
Predicate。返回值: 一个
boolean值。示例:
javaList<Integer> numbers = List.of(1, 3, 5); boolean noEven = numbers.stream() .noneMatch(n -> n % 2 == 0); System.out.println(noEven); // 输出:true
2.7 findAny
描述: 返回流中的任意一个元素(通常是第一个元素)。
返回值: 一个
Optional<T>。示例:
javaList<Integer> numbers = List.of(1, 2, 3, 4, 5); Optional<Integer> anyNumber = numbers.stream() .findAny(); anyNumber.ifPresent(System.out::println); // 输出:1 或其他
2.8 findFirst
描述: 返回流中的第一个元素。
返回值: 一个
Optional<T>。示例:
javaList<Integer> numbers = List.of(1, 2, 3, 4, 5); Optional<Integer> firstNumber = numbers.stream() .findFirst(); firstNumber.ifPresent(System.out::println); // 输出:1
2.9 reduce
描述: 将流中的元素组合成一个值(通常是累积操作,如求和、求积、拼接字符串等)。
参数:
- 一个初始值(可选)。
- 一个
BinaryOperator,定义如何将两个元素合并。
返回值: 一个
Optional<T>或具体的结果值(如果提供初始值)。示例 1(求和):
java复制代码List<Integer> numbers = List.of(1, 2, 3, 4, 5); int sum = numbers.stream() .reduce(0, (a, b) -> a + b); System.out.println(sum); // 输出:15示例 2(字符串拼接):
java复制代码List<String> words = List.of("Java", "Stream", "API"); String concatenated = words.stream() .reduce("", (a, b) -> a + b); System.out.println(concatenated); // 输出:JavaStreamAPI示例 3(无初始值):
java复制代码List<Integer> numbers = List.of(1, 2, 3, 4, 5); Optional<Integer> product = numbers.stream() .reduce((a, b) -> a * b); product.ifPresent(System.out::println); // 输出:120
2.10 max 和 min
描述: 查找流中最大或最小的元素。
参数: 接收一个
Comparator,定义比较规则。返回值: 一个
Optional<T>。示例 1(查找最大值):
java复制代码List<Integer> numbers = List.of(1, 2, 3, 4, 5); Optional<Integer> max = numbers.stream() .max(Integer::compareTo); max.ifPresent(System.out::println); // 输出:5示例 2(查找最小值):
java复制代码List<Integer> numbers = List.of(1, 2, 3, 4, 5); Optional<Integer> min = numbers.stream() .min(Integer::compareTo); min.ifPresent(System.out::println); // 输出:1
2.11 toArray
描述: 将流中的元素收集到数组中。
返回值: 一个数组,包含流中的所有元素。
示例
:
java复制代码List<String> names = List.of("Alice", "Bob", "Charlie"); String[] nameArray = names.stream() .toArray(String[]::new); System.out.println(Arrays.toString(nameArray)); // 输出:[Alice, Bob, Charlie]
2.12 peek
描述: 用于在流的每个元素上执行操作(通常用于调试)。不会改变流的元素。
参数: 接收一个
Consumer。返回值: 返回一个新的 Stream。
示例
:
java复制代码List<Integer> numbers = List.of(1, 2, 3, 4, 5); numbers.stream() .filter(n -> n % 2 == 0) .peek(n -> System.out.println("Processing: " + n)) // 调试信息 .map(n -> n * n) .forEach(System.out::println); // 输出:Processing: 2, 4, 16
3. 并行流操作
Stream API 还支持并行操作,通过调用 parallelStream() 或 stream().parallel() 可以将流转换为并行流,利用多核 CPU 提升性能。
示例:
java复制代码List<Integer> numbers = List.of(1, 2, 3, 4, 5);
int sum = numbers.parallelStream()
.reduce(0, Integer::sum);
System.out.println(sum); // 输出:15注意事项:
- 并行流会将操作分发到多个线程中执行。
- 并行流的性能提升取决于数据量、操作的复杂性和可用的 CPU 核心数。
- 不适合需要严格顺序的操作(如
findFirst等)。
4. Stream 的短路操作
短路操作是指在某些条件满足后,流可以提前终止操作,而无需处理所有元素。以下方法是典型的短路操作:
anyMatch: 一旦找到一个匹配元素,就停止处理。allMatch: 一旦发现一个不匹配元素,就停止处理。noneMatch: 一旦找到一个匹配元素,就停止处理。findAny: 一旦找到一个元素,就停止处理。limit: 一旦达到指定的元素数量,就停止处理。
示例(短路操作):
java复制代码List<Integer> numbers = List.of(1, 2, 3, 4, 5);
// anyMatch 示例
boolean hasEven = numbers.stream()
.anyMatch(n -> n % 2 == 0);
System.out.println(hasEven); // 输出:true
// allMatch 示例
boolean allPositive = numbers.stream()
.allMatch(n -> n > 0);
System.out.println(allPositive); // 输出:true
// noneMatch 示例
boolean noNegative = numbers.stream()
.noneMatch(n -> n < 0);
System.out.println(noNegative); // 输出:true
// findAny 示例
Optional<Integer> anyNumber = numbers.stream()
.findAny();
anyNumber.ifPresent(System.out::println); // 输出:1 或其他5. 总结
Java 的 Stream API 提供了强大的数据处理能力,常用的操作包括:
中间操作
:
filter、map、flatMap、distinct、sorted、limit、skip、peek。
终端操作
:
forEach、collect、reduce、count、max、min、anyMatch、allMatch、noneMatch、findAny、findFirst。
短路操作
:
anyMatch、allMatch、noneMatch、findAny、limit。
并行流
:
- 使用
parallelStream()或stream().parallel()提升性能。
- 使用