Java 中 Stream 的中间方法

javaobject oriented programmingprogramming更新于 2024/8/5 5:19:00

在 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) {
        // 创建数字列表
        List<Integer> numbers = Arrays.asList(5, 21, 32, 14, 63, 19, 10);
        // 打印列表中的所有数字
        System.out.println("所有数字列表:" + numbers);
        System.out.println("奇数列表:");
        // 仅从列表中筛选奇数
        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) {
        // 创建整数列表
        List<Integer> AList1 = Arrays.asList(11, 22, 33, 44, 55);
        // 将第一个列表的元素复制到新列表
        List<Integer> AList2 = AList1.stream()
        // 复制元素
        .map(i -> i)
        // 收集结果
        .collect(Collectors.toList());
        // 打印结果
        System.out.println("列表的元素:" + AList2);
   }
}

输出

列表的元素:[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) {
        // 创建数字列表
        List<Integer> numbers = Arrays.asList(5, 21, 32, 14, 63, 19, 10);
        // 打印列表中的所有数字
        System.out.println("所有数字列表:" + numbers);
        System.out.println("奇数列表:");
        // 仅从列表中过滤奇数
        numbers.stream()
        .filter(nums -> nums % 2 == 1)
        // 使用 peek 获取结果
        .peek(nums -> System.out.println(nums))
        // 收集结果
        .collect(Collectors.toList());
   }
}

输出

所有数字列表:[5, 21, 32, 14, 63, 19, 10]
奇数列表:
5
21
63
19

limit() 方法

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

示例 

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

import java.util.*;
public class LimitExample {
   public static void main(String[] args) {
        // 创建数字列表
        List<Integer> numbers = Arrays.asList(5, 21, 32, 14, 63, 19, 10);
        // 打印列表中的所有数字
        System.out.println("所有数字列表:" + numbers);
        System.out.println("奇数列表:");
        // 仅从列表中过滤奇数
        numbers.stream()
            .filter(nums -> nums % 2 == 1)
            // 将结果限制为 2
            .limit(2)
            .forEach(System.out::println);
   }
}

输出

所有数字列表:[5, 21, 32, 14, 63, 19, 10]
奇数列表:
5
21

skip() 方法

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

示例 

以下示例演示如何使用 skip() 方法从过滤结果中丢弃前两个元素。

import java.util.*;
public class SkipExample {
   public static void main(String[] args) {
        // 创建数字列表
        List<Integer> numbers = Arrays.asList(5, 21, 32, 14, 63, 19, 10);
        // 打印列表中的所有数字
        System.out.println("所有数字列表:" + numbers);
        System.out.println("奇数列表:");
        // 仅从列表中过滤奇数
        numbers.stream()
            .filter(nums -> nums % 2 == 1)
            // 从结果中跳过前 2 个元素
            .skip(2)
            .forEach(System.out::println);
   }
}

输出

所有数字列表:[5, 21, 32, 14, 63, 19, 10]
奇数列表:
63
19

sorted() 方法

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

示例 

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

import java.util.*;
public class SortedExample {
   public static void main(String[] args) {
        // 创建数字列表
        List<Integer> numbers = Arrays.asList(5, 21, 32, 14, 63, 19, 10);
        // 按升序打印列表中的所有数字
        System.out.println("数字列表:");
        // 对列表元素进行排序
        numbers.stream()
            .sorted()
            .forEach(System.out::println);
   }
}

输出

数字列表:
5
10
14
19
21
32
63

distinct() 方法

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

示例 

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

import java.util.*;
public class DistinctExample {
   public static void main(String[] args) {
    // 创建数字列表
    List<Integer> numbers = Arrays.asList(21, 21, 32, 14, 19, 19, 10, 10);
    System.out.println("不同的数字列表:");
    // 从列表中删除重复的数字
    numbers.stream()
        .distinct()
        .forEach(System.out::println);
   }
}

输出

不同的数字列表:
21
32
14
19
10

结论

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


相关文章