Java filter() 方法的后台工作原理?


Java 的 filter() 方法允许我们根据指定的条件筛选流中的元素。它是高阶函数的一部分,用于对流项目应用某种行为。此方法接受一个谓词作为参数,并返回与谓词匹配的元素列表。但问题是,filter() 方法在后台是如何工作的呢?本文旨在通过一些示例程序来解释这个问题。

filter() 方法的后台工作原理

在深入研究 filter() 方法之前,让我们先了解一下 I/O 流。它是在 Java 中执行输入和输出操作时使用的抽象。基本上,输入流用于从键盘、磁盘文件等来源获取输入。输出流指的是数据显示或写入的目标。

现在回到我们关于 filter() 方法的讨论。前面我们提到了“谓词”这个术语,你可能想知道这是什么以及它与 filter() 方法一起使用的目的是什么。整个过滤过程都围绕着这个谓词展开。它是一个作为参数传递给 filter() 方法的功能接口,充当筛选流中不匹配元素的条件。最初,此方法不会丢弃不匹配的元素。相反,它会生成一个新的元素流,其中只包含与谓词条件匹配的元素。

请注意,filter() 方法是一个无状态的中间操作,这意味着它不会产生结果,除非我们将其与终止操作(如 count()、collect() 或 forEach())组合使用。这里,无状态意味着它不会存储任何有关先前操作的信息以供将来使用。

高阶函数有两种

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

  • 终止操作 − 它们触发中间操作以产生非流结果。

filter() 的语法

filter(predicate);

方法

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

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

  • 再次使用 filter() 方法以及 stream() 和 count() 来打印奇数的个数。

示例 1

下面的示例演示了 filter() 方法的使用。

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);
      System.out.println("Count of odd numbers: ");
      // printing the count of odd numbers
      System.out.println(numbers.stream()
         .filter(nums -> nums % 2 == 1)
         .count());
   }
}

输出

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

方法

  • 第一步是导入“java.util.function.Predicate”以启用 Predicate 类的使用。

  • 定义一个固定大小的列表。

  • 现在,将打印奇数的条件使用抽象方法 test() 放入 Predicate 定义中。

  • 调用 filter() 方法以及 stream() 和 forEach() 来筛选出奇数。将谓词类的实例传递到 filter() 中。

  • 再次调用 filter() 方法以及 stream() 和 count() 来打印奇数的个数。

示例 2

让我们看看 filter() 方法的另一个示例,我们将使用 Predicate 类。

import java.util.*;
import java.util.function.Predicate;
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
      Predicate<Integer> newNumbers = new Predicate<Integer>()
      {
         @Override
         public boolean test(Integer nums) {
            return nums % 2 == 1;
         }
      };
      numbers.stream()
         .filter(newNumbers)
         .forEach(System.out::println);
      System.out.println("Count of odd numbers: ");
      // printing the count of odd numbers
      System.out.println(numbers.stream()
         .filter(newNumbers)
         .count());
   }
}

输出

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

结论

filter() 方法在后台的工作原理是按需将谓词应用于每个元素。我们已经通过 Java 示例程序详细定义和解释了 filter() 方法的工作原理。此外,我们还了解了 Java 编程语言中可用的高阶函数类型。

更新于:2023年7月21日

浏览量:288

开启你的职业生涯

完成课程获得认证

开始学习
广告