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 编程语言中可用的高阶函数类型。