迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

Java 中的流过滤器

作者:迹忆客 最近更新:2023/10/17 浏览次数:

本教程介绍 Java 中的流 API 及其 filter() 方法。在 Java 中,流是对象的集合。

流不存储任何数据,因此它不是数据结构。流具有各种方法,可以将它们一起流水线化以获得所需的结果。

其中一种方法是 filter 方法。我们将看到使用本文的 filter() 操作的各种示例。

让我们首先了解 filter() 操作。filter() 方法返回一个带有元素的新流,这些元素与作为参数传递给它的谓词匹配。

换句话说,filter() 操作用于过滤传入流并输出新流。此方法的语法是:

Stream<T> filter(Predicate<? super T> predicate)

谓词是一个函数接口,这意味着我们可以在这里传递一个 lambda 函数或方法引用。现在让我们看一些例子。


在 Java 中使用 filter()collect() 方法的流

collect() 操作是一种终端操作。

终端操作在最后应用于流以产生结果。应用终端算子后,流被消费,不能再消费。

collect() 操作返回中间操作的输出;它还可用于将输出转换为所需的数据结构。看下面的例子。

假设我们有一个班级中所有学生的列表,并且我们想要创建一个新列表,其中包含除一个之外的所有学生的姓名。假设一名学生离开了学校。

我们可以通过这个给定的代码来做到这一点。

import java.util.*;
import java.util.stream.Collectors;
public class MyClass {
    public static void main(String args[]) {
        List<String> students = Arrays.asList("Kashish", "Riyan", "Ritu");
        
        List<String> new_students = students.stream().filter(sName -> !"Riyan".equals(sName)).collect(Collectors.toList());
        
        new_students.forEach(System.out::println);
    }
}

输出:

Kashish
Ritu

在这段代码中,首先创建了一个学生姓名流。

然后使用谓词过滤流:所有不等于 Riyan 的名称。filter 操作生成一个新流,其中包含满足该谓词的所有元素。

然后使用 collect 操作将新创建的流转换为 List


Java 中带有 filter()forEach() 方法的流

forEach() 方法也是一个终端操作。它将作为参数传递的函数应用于每个流元素。

它的工作方式类似于 foreach 循环,但仅适用于流。请参见下面的示例。

假设我们要打印所有能被 5 整除的数字。下面的代码就是这样工作的。

import java.util.*;
import java.util.stream.Collectors;
public class MyClass {
    public static void main(String args[]) {
        List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,21,11,10,25);
        
        numbers.stream().filter(n -> n % 5 == 0).forEach(System.out::println);
    }
}

输出:

5
10
25

在 Java 中使用 filter() 和多个条件的流

我们可以使用逻辑运算符将多个条件传递给 filter() 操作以获得更精细的结果。假设我们要找出所有能被 5 整除且大于 10 的元素;请参见下面的示例。

import java.util.*;
import java.util.stream.Collectors;
public class MyClass {
    public static void main(String args[]) {
        List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,21,11,10,25);
        
        numbers.stream().filter(n -> n % 5 == 0 && n > 10).forEach(System.out::println);
    }
}

输出:

25

在 Java 中使用 filter()map() 的流

map() 操作就像 forEach() 操作。

它将一个函数应用于流的每个元素。它是一种中间操作,而不是终端操作。

假设我们必须将所有可被 5 整除的元素平方。我们可以通过流水线化 filtermap 操作来做到这一点。

请参见下面的示例。

import java.util.*;
import java.util.stream.Collectors;
public class MyClass {
    public static void main(String args[]) {
        List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,21,11,10,25);
        
        List<Integer> new_numbers = numbers.stream().filter(n -> n % 5 == 0).map(x -> x * x).collect(Collectors.toList());
        
        new_numbers.forEach(System.out::println);
    }
}

输出:

25
100
625

在上面的代码中,首先过滤整数列表。过滤列表后,流中剩余的每个元素都使用 map() 操作进行平方。

最后,我们将流转换为列表并将其存储在 new_numbers 列表中。


在 Java 中堆叠多个 filter() 方法的流

我们可以通过一个接一个地应用来堆叠 filter() 方法以获得更精细的结果。

假设我们首先要过滤长度大于 3 的字符串,然后过滤包含 stack 作为子字符串的字符串。我们可以通过使用下面的代码示例来做到这一点。

import java.util.*;
import java.util.stream.Collectors;
public class MyClass {
    public static void main(String args[]) {
        List<String> str = Arrays.asList("Hello", "I" , "Love", "Jiyik");
        
        List<String> new_string = str.stream().filter(n -> n.length() > 3).filter(n -> n.contains("k")).collect(Collectors.toList());
        
        new_string.forEach(System.out::println);
    }
}

输出:

Jiyik

请注意,上面的代码等效于使用 && 运算符使用多个条件。往下看:

import java.util.*;
import java.util.stream.Collectors;
public class MyClass {
    public static void main(String args[]) {
        List<String> str = Arrays.asList("Hello", "I" , "Love", "Jiyik");
        
        List<String> new_string = str.stream().filter(n -> n.length() > 3 && n.contains("k")).collect(Collectors.toList());
        
        new_string.forEach(System.out::println);
    }
}

输出:

Jiyik

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Do you understand JavaScript closures?

发布时间:2025/02/21 浏览次数:108 分类:JavaScript

The function of a closure can be inferred from its name, suggesting that it is related to the concept of scope. A closure itself is a core concept in JavaScript, and being a core concept, it is naturally also a difficult one.

Do you know about the hidden traps in variables in JavaScript?

发布时间:2025/02/21 浏览次数:178 分类:JavaScript

Whether you're just starting to learn JavaScript or have been using it for a long time, I believe you'll encounter some traps related to JavaScript variable scope. The goal is to identify these traps before you fall into them, in order to av

How much do you know about the Prototype Chain?

发布时间:2025/02/21 浏览次数:150 分类:JavaScript

The prototype chain can be considered one of the core features of JavaScript, and certainly one of its more challenging aspects. If you've learned other object-oriented programming languages, you may find it somewhat confusing when you start

在 Pandas 的列中展平层次索引

发布时间:2024/04/24 浏览次数:1782 分类:Python

在这篇文章中,我们将使用不同的函数来使用 Pandas DataFrame 列来展平层次索引。我们将使用的方法是重置索引和 as_index() 函数。

Pandas 中的 Groupby 索引列

发布时间:2024/04/23 浏览次数:89 分类:Python

本教程将介绍如何使用 Python Pandas Groupby 对数据进行分类,然后将函数应用于类别。通过示例使用 groupby() 函数按 Pandas 中的多个索引列进行分组。

Pandas 中的散点矩阵

发布时间:2024/04/23 浏览次数:125 分类:Python

本教程演示了如何使用 scatter_matrix 函数在 Pandas 中创建散点图。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便