Java filter()方法在后台是如何工作的
Java的filter()方法允许我们根据指定的条件对流中的元素进行过滤。它是一个高阶函数的一部分,用于对流项应用特定的行为。该方法接受一个谓词(predicate)作为参数,并返回与谓词匹配的元素列表。但是这里的问题是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类的使用。 -
定义一个固定大小的列表。
-
现在,使用Predicate定义一个抽象方法test()来设置打印奇数的条件。
-
使用filter()方法以及stream()和forEach()方法来过滤出奇数。将Predicate类的实例作为参数传入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编程语言中可用的高阶函数类型。