Java 中 Stream 的中间操作


在 Java 中,流允许我们对指定元素执行函数式操作。它简单地将源元素(例如数组、文件和集合框架类)通过各种内置方法传递,以返回结果。这些内置方法可以是中间操作或终端操作。在本文中,我们将探讨 Stream 的一些中间操作方法,例如 map、filter、reduce 和 collect。这些方法可以帮助我们操作和处理数据。

Java 流的中间操作

Java 流的方法统称为高阶函数,进一步分为:

  • 中间操作 - 它们处理输入流的元素。

  • 终端操作 - 它们触发中间操作以产生非流结果,例如打印、计数和存储。

在本节中,我们将仅通过各种示例讨论流的中间操作。

Java 中流的中间操作列表:

  • filter()

  • map()

  • peek()

  • limit()

  • skip()

  • sorted()

  • distinct()

让我们逐一讨论它们。

filter() 方法

Java filter() 方法允许我们根据指定的条件筛选流的元素。它用于对流项应用某种行为。此方法将谓词作为参数,并返回与谓词匹配的元素列表。

语法

filter(predicate);

示例

以下示例说明了 filter() 方法的使用。

  • 使用 Arrays.asList() 方法创建一个列表以存储固定大小的列表。

  • 现在,使用 filter() 方法以及 stream() 和 forEach() 仅筛选出奇数。这里,stream() 指定以流的形式输入,我们将使用终端方法 forEach() 来迭代和打印奇数。

import java.util.*;
public class Fltr {
   public static void main(String[] args) {
      // creating a list of numbers
      List<Integer> numbers = Arrays.asList(5, 21, 32, 14, 63, 19, 10);
      // printing all numbers in the list
      System.out.println("List of all numbers: " + numbers);
      System.out.println("List of odd numbers: ");
      // filtering only odd numbers from list
      numbers.stream()
         .filter(nums -> nums % 2 == 1)
         .forEach(System.out::println);
   }
}

输出

List of all numbers: [5, 21, 32, 14, 63, 19, 10]
List of odd numbers: 
5
21
63
19

map() 方法

此方法将 Function 作为参数,并将其应用于 Stream 的每个元素,这将产生一个新的映射元素的 Stream。例如,我们可以使用 map() 将字符串 Stream 转换为整数 Stream。

示例

在此示例中,我们将使用 map() 方法将一个列表的元素复制到另一个列表。

import java.util.*;
import java.util.stream.Collectors;
public class MapExample {
   public static void main(String[] args) {
      // creating a list of integers
      List<Integer> AList1 = Arrays.asList(11, 22, 33, 44, 55);
      // to copy elements of first list to new list 
      List<Integer> AList2 = AList1.stream()
         // copying the elements
         .map(i -> i) 
         // collecting the result
         .collect(Collectors.toList()); 
      // Printing the result
      System.out.println("The elements of the list: " + AList2);
   }
}

输出

The elements of the list: [11, 22, 33, 44, 55]

peek() 方法

我们可以使用 peek() 方法打印每个中间操作的结果。

示例

在以下示例中,我们将使用 filter() 方法以及 peek() 打印数字列表中的奇数。

import java.util.*;
import java.util.stream.Collectors;
public class PeekExample {
   public static void main(String[] args) {
      // creating a list of numbers
      List<Integer> numbers = Arrays.asList(5, 21, 32, 14, 63, 19, 10);
      // printing all numbers in the list
      System.out.println("List of all numbers: " + numbers);
      System.out.println("List of odd numbers: ");
      // filtering only odd numbers from list
      numbers.stream()
         .filter(nums -> nums % 2 == 1)
         // using peek to get the result
         .peek(nums -> System.out.println(nums))
         // collecting the result
         .collect(Collectors.toList()); 
   }
}

输出

List of all numbers: [5, 21, 32, 14, 63, 19, 10]
List of odd numbers: 
5
21
63
19

limit() 方法

使用 limit() 方法的目的是将输出的大小限制为指定的限制。

示例

在此示例中,我们将使用 limit() 方法将中间操作的结果限制为指定的大小。

import java.util.*;
public class LimitExample {
   public static void main(String[] args) {
      // creating a list of numbers
      List<Integer> numbers = Arrays.asList(5, 21, 32, 14, 63, 19, 10);
      // printing all numbers in the list
      System.out.println("List of all numbers: " + numbers);
      System.out.println("List of odd numbers: ");
      // filtering only odd numbers from list
      numbers.stream()
         .filter(nums -> nums % 2 == 1)
         // limiting the result to 2 only
         .limit(2)
         .forEach(System.out::println);
   }
}

输出

List of all numbers: [5, 21, 32, 14, 63, 19, 10]
List of odd numbers: 
5
21

skip() 方法

我们可以使用 skip() 方法丢弃结果中的前 n 个元素。它将一个整数作为参数,该参数指定将被丢弃的元素。

示例

以下示例演示了如何使用 skip() 方法丢弃筛选结果中的前两个元素。

import java.util.*;
public class SkipExample {
   public static void main(String[] args) {
      // creating a list of numbers
      List<Integer> numbers = Arrays.asList(5, 21, 32, 14, 63, 19, 10);
      // printing all numbers in the list
      System.out.println("List of all numbers: " + numbers);
      System.out.println("List of odd numbers: ");
      // filtering only odd numbers from list
      numbers.stream()
         .filter(nums -> nums % 2 == 1)
         // skipping first 2 elements from the result
         .skip(2)
         .forEach(System.out::println);
   }
}

输出

List of all numbers: [5, 21, 32, 14, 63, 19, 10]
List of odd numbers: 
63
19

sorted() 方法

此方法可用于按升序对流的元素进行排序。

示例

以下示例说明了如何使用 sorted() 方法按升序对流的元素进行排序。

import java.util.*;
public class SortedExample {
   public static void main(String[] args) {
      // creating a list of numbers
      List<Integer> numbers = Arrays.asList(5, 21, 32, 14, 63, 19, 10);
      // printing all numbers from the list in ascending order 
      System.out.println("List of numbers: ");
      // Sorting the elements of list
      numbers.stream()
         .sorted()
         .forEach(System.out::println);
   }
}

输出

List of numbers: 
5
10
14
19
21
32
63

distinct() 方法

要删除流元素中的重复项,我们可以使用 distinct() 方法。

示例

在此示例中,我们将创建一个包含重复元素的流,并应用 distinct() 方法仅打印唯一元素。

import java.util.*;
public class DistinctExample {
   public static void main(String[] args) {
      // creating a list of numbers
      List<Integer> numbers = Arrays.asList(21, 21, 32, 14, 19, 19, 10, 10);
      System.out.println("Distinct list of numbers: ");
      // removing duplicate numbers from the list 
      numbers.stream()
         .distinct()
         .forEach(System.out::println);
   }
}

输出

Distinct list of numbers: 
21
32
14
19
10

结论

我们从定义流及其作为 Java 中高阶函数一部分的中间操作开始本文。在下一节中,我们借助示例程序详细讨论了中间操作方法。

更新于:2023年8月17日

1K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告

© . All rights reserved.