Java Stream filter()方法详解

后端 潘老师 6个月前 (10-29) 146 ℃ (0) 扫码查看

学习使用 Stream.filter(Predicate) 方法遍历所有元素,并通过 Predicate 参数过滤出符合给定条件(通过 Predicate 参数定义)的所有项目。

1.Stream filter() 方法

stream() 方法语法如下:

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

Predicate 是一个函数式接口,表示从 Stream 中过滤出不匹配元素的条件。

  • filter() 是一个中间流操作。
  • 它返回一个由给定流中符合给定Predicate 的元素组成的流。
  • filter() 参数应该是一个无状态的Predicate ,应用于流中的每个元素以确定是否应该包含该元素。
  • Predicate 是一个函数式接口。因此,我们还可以传递 lambda 表达式。
  • 它返回一个新的 Stream,这样我们就可以使用适用于任何流的其它操作。

2. Java Stream filter() 示例

2.1使用 Lambda 表达式过滤 Stream

在这个例子中,我们遍历一个数字流。我们将从流中找到所有偶数并打印到控制台。

内联谓词 ‘n -> n % 2 == 0’ 是一个 lambda 表达式。

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

输出:

2
4
6
8
10

2.2 使用自定义谓词过滤 Stream

这个例子重写了第一个例子。它使用 Predicate 类代替 lambda 表达式,尽管它们是相同的东西。

注意:我们可以在Predicate 中编写任何条件,以符合业务要求。

public class Main 
{
    public static void main(String[] args) 
    {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
         
        Predicate<Integer> condition = new Predicate<Integer>() 
        {
            @Override
            public boolean test(Integer n) {
                if (n % 2 == 0) {
                    return true;
                }
                return false;
            }
        };
 
        list.stream().filter(condition).forEach(System.out::println); //246810
    }
}

2.3 过滤并收集到 List 中

我们可以使用 collect(Collectors.toList()) 方法将过滤后的流的元素收集到列表中。

这个例子重写了第一个例子。在此,我们将偶数收集到列表中,而不是将它们打印到控制台。

public class Main 
{
    public static void main(String[] args) 
    {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
 
        List<Integer> evenNumbers = list.stream()
                    .filter(n -> n % 2 == 0)
                    .collect(Collectors.toList());
         
        System.out.println(evenNumbers); //[2, 4, 6, 8, 10]
    }
}

2.4. Stream filter() 和 map() 示例

我们可以使用 map() 方法来收集流元素,然后在将其收集到列表之前将每个数字转换为平方数。

public class Main 
{
    public static void main(String[] args) 
    {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
 
        List<Integer> evenNumbers = list.stream()
                    .filter(n -> n % 2 == 0)
                    .map(n -> n * n)
                    .collect(Collectors.toList());
         
        System.out.println(evenNumbers);//[4, 16, 36, 64, 100]
    }
}

2.5 Stream filter() 中带有抛出异常的方法

用于Predicate 的方法返回布尔值。这些方法通常进行简单的值比较,不会抛出任何异常。

但是,有时我们可能需要处理这种会抛出异常的方法,这种方法必须在 Predicate 中使用。

要解决这个问题,我们必须使用 try-catch 语句来捕获受检查的异常。然后我们有两种选择:要么处理该异常,要么将其重新抛出为未受检查的异常。

以下是处理 Predicate 中使用的受检查异常方法的代码示例:

List<Integer> evenNumbers = list.stream()
    .filter(a -> {
            try {
                return a.someMethodThrowingCheckedException();
            } catch (IOException e) {
                throw new UncheckedException(e);
            }
        })
    .collect(Collectors.toList());

版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/10481.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】