Java 8引入了一项重要的特性,即Stream API。Stream API提供了一种流式操作的方式,可以对集合进行过滤、映射、排序、聚合等操作,使得代码更简洁、易读,并且支持并行处理,提高了性能。本文将介绍如何结合Lambda表达式和Java 8的Stream API来进行集合操作,展示Stream API的强大功能和使用方法。

创建Stream

在使用Stream API之前,我们首先需要创建一个Stream对象,可以通过以下方式创建:

  • 从集合创建Stream:

    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    Stream<Integer> stream = numbers.stream();
  • 从数组创建Stream:

    int[] array = {1, 2, 3, 4, 5};
    IntStream stream = Arrays.stream(array);
  • 使用Stream的静态方法创建Stream:

    Stream<String> stream = Stream.of("a", "b", "c");

中间操作

中间操作是对Stream对象进行转换和处理的操作,可以链式调用多个中间操作。

  • filter:根据指定的条件过滤集合元素。

    List<Integer> evenNumbers = numbers.stream()
                                     .filter(n -> n % 2 == 0)
                                     .collect(Collectors.toList());
  • map:将集合元素进行转换,生成一个新的Stream。

    List<String> upperCaseNames = names.stream()
                                     .map(String::toUpperCase)
                                     .collect(Collectors.toList());
  • sorted:对集合元素进行排序。

    List<Integer> sortedNumbers = numbers.stream()
                                       .sorted()
                                       .collect(Collectors.toList());
  • distinct:去除重复的集合元素。

    List<Integer> uniqueNumbers = numbers.stream()
                                       .distinct()
                                       .collect(Collectors.toList());
  • limit:限制Stream的大小。

    List<Integer> limitedNumbers = numbers.stream()
                                        .limit(3)
                                        .collect(Collectors.toList());
  • skip:跳过指定数量的元素。

    List<Integer> skippedNumbers = numbers.stream()
                                        .skip(2)
                                        .collect(Collectors.toList());

终端操作

终端操作是对Stream对象进行最终操作的操作,执行终端操作后,Stream将不可再用。

  • forEach:对集合中的每个元素执行指定的操作。

    names.stream()
       .forEach(System.out::println);
  • collect:将Stream中的元素收集到一个集合中。

    List<Integer> collectedNumbers = numbers.stream()
                                          .collect(Collectors.toList());
  • reduce:将Stream中的元素进行归约操作,生成一个结果。

    int sum = numbers.stream()
                   .reduce(0, (a, b) -> a + b);
  • count:统计Stream中的元素数量。

    long count = numbers.stream()
                      .count();
  • min和max:求Stream中的最小值和最大值。

    Optional<Integer> min = numbers.stream()
                                 .min(Integer::compareTo);
    
    Optional<Integer> max = numbers.stream()
                                 .max(Integer::compareTo);
  • anyMatch、allMatch和noneMatch:判断Stream中是否存在满足指定条件的元素。

    boolean anyMatch = numbers.stream()
                            .anyMatch(n -> n > 5);
    
    boolean allMatch = numbers.stream()
                            .allMatch(n -> n > 0);
    
    boolean noneMatch = numbers.stream()
                             .noneMatch(n -> n < 0);

并行处理

Stream API支持并行处理,通过将Stream转换为并行流,可以充分利用多核处理器的优势,提高处理速度。

List<Integer> evenNumbers = numbers.parallelStream()
                                   .filter(n -> n % 2 == 0)
                                   .collect(Collectors.toList());

结论:
通过结合Lambda表达式和Java 8的Stream API,我们可以以一种简洁、灵活和高效的方式对集合进行操作。Stream API提供了丰富的中间操作和终端操作,可以满足各种需求,如过滤、映射、排序、归约等。同时,Stream API还支持并行处理,通过将Stream转换为并行流,可以充分利用多核处理器的优势,提高处理速度。使用Stream API,我们可以编写出更具表现力和可读性的代码,提高开发效率。

参考链接:

最后修改:2025 年 07 月 02 日
如果觉得我的文章对你有用,请随意赞赏