Skip to content

Java Stream API 中常用方法的详细介绍,包括你提到的 anyMatchallMatchnoneMatchfindAny,以及其他相关表达式。

1. 中间操作(Intermediate Operations)

中间操作是惰性操作,返回,不会立即执行,只有当遇到终端操作时才会触发计算。

1.1 filter

  • 描述: 用于筛选流中的元素。

  • 参数: 接收一个 Predicate(布尔条件)。

  • 返回值: 一个只包含满足条件的元素的新 Stream。

  • 示例:

    java
    List<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,包含所有子流中的元素。

  • 示例:

    java
    List<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。

  • 示例:

    java
    List<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。

  • 示例:

    java
    List<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。

  • 示例:

    java
    List<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。

  • 示例:

    java
    List<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)。

  • 示例:

    java
    List<String> names = List.of("Alice", "Bob", "Charlie");
    names.stream()
         .forEach(System.out::println); // 输出:Alice, Bob, Charlie

2.2 collect

  • 描述: 将流中的元素收集到集合或其他容器中。

  • 参数: 接收一个 Collector,指定收集方式。

  • 返回值: 根据收集器的定义返回结果。

  • 示例:

    java
    List<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 类型的值,表示元素数量。

  • 示例:

    java
    List<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 值。

  • 示例:

    java
    List<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 值。

  • 示例:

    java
    List<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 值。

  • 示例:

    java
    List<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>

  • 示例:

    java
    List<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>

  • 示例:

    java
    List<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 maxmin

  • 描述: 查找流中最大或最小的元素。

  • 参数: 接收一个 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 提供了强大的数据处理能力,常用的操作包括:

  • 中间操作

    :

    • filtermapflatMapdistinctsortedlimitskippeek
  • 终端操作

    :

    • forEachcollectreducecountmaxminanyMatchallMatchnoneMatchfindAnyfindFirst
  • 短路操作

    :

    • anyMatchallMatchnoneMatchfindAnylimit
  • 并行流

    :

    • 使用 parallelStream()stream().parallel() 提升性能。