stream().filter匹配过滤总结


前言

Java集合Stream 出自 Java8。
可谓是加量不加价,丰富了使用场景,还精简了代码。虽然牺牲了一点可读性,但总体来说是很好用的。以下总结其中 filter 的一些用法,整理相关的例子。


以下是几种场景

一、简单匹配过滤

简单对象

public class TestFilter {
    public static void main(String[] args) {

        List<String> list = Arrays.asList("AAB","BBB","ACC");

        System.out.println("过滤相等-------------------------------------------");
        List<String> result1 = list.stream().filter(v -> v.equals("AAB")).collect(Collectors.toList());
        result1.forEach(v-> System.out.println(v));

        System.out.println("过滤 模糊相等(包含)-------------------------------------------");
        List<String> result2 = list.stream().filter(v -> v.contains("B")).collect(Collectors.toList());
        result2.forEach(v-> System.out.println(v));

        System.out.println("多条件 过滤 与:&&; 或||-------------------------------------------");
        List<String> result3 = list.stream().filter(v -> v.contains("A") && v.contains("C")).collect(Collectors.toList());
        result3.forEach(v-> System.out.println(v));
    }
}

运行结果
在这里插入图片描述
可见,filter支持单条件,多条件组合匹配过滤


二、对象匹配过滤

假设对象

public class User {

    /** 名称 */
    private String name;

    /** 年龄 */
    private Integer age;
}

例子

public class TestFilter1 {
    public static void main(String[] args) {

        List<User> userList = new ArrayList<>();
        userList.add(new User("小明", 18));
        userList.add(new User("王姐", 21));

        System.out.println("过滤相等-------------------------------------------");
        List<User> result1 = userList.stream().filter(v -> v.getName().equals("小明")).collect(Collectors.toList());
        result1.forEach(v-> System.out.println(v));
    }
}

运行结果
在这里插入图片描述


三、自定义匹配过滤

看看filter接口的源码

public interface Stream<T> extends BaseStream<T, Stream<T>> {

    /**
     * Returns a stream consisting of the elements of this stream that match
     * the given predicate.
     *
     * <p>This is an <a href="package-summary.html#StreamOps">intermediate
     * operation</a>.
     *
     * @param predicate a <a href="package-summary.html#NonInterference">non-interfering</a>,
     *                  <a href="package-summary.html#Statelessness">stateless</a>
     *                  predicate to apply to each element to determine if it
     *                  should be included
     * @return the new stream
     */
    Stream<T> filter(Predicate<? super T> predicate);

可以看到,filter接收的参数是Predicate,这是一个布尔接口,用于各种匹配,所以自定义filter实际上我们是你把Predicate的用法丰富起来
比如:

public class TestFilter1 {
    public static void main(String[] args) {

        List<User> userList = new ArrayList<>();
        userList.add(new User("小明", 18));
        userList.add(new User("王姐", 21));

        System.out.println("过滤相等-------------------------------------------");
        List<User> result2 = userList.stream().filter(new Predicate<User>() {
            @Override
            public boolean test(User user) {
                if (user.getAge() > 18) {
                    return true;
                }else{
                    return false;
                }
            }
        }).collect(Collectors.toList());
        result2.forEach(v-> System.out.println(v));
    }
}

运行结果
在这里插入图片描述

  • 17
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
引用和提供了两个示例,展示了使用Java Stream中的filter方法进行模糊过滤的方式。在这些示例中,filter方法接收一个Predicate参数,该参数是一个布尔接口,用于各种匹配。通过在Predicate的test方法中定义过滤条件,我们可以实现模糊过滤。例如,我们可以使用contains方法来判断字符串中是否包含某个字符或字符串。 在引用的示例中,通过使用filter方法,我们可以过滤出列表中包含特定字符或字符串的元素。例如,可以使用v.contains("B")来过滤出包含字符"B"的元素。 在引用的示例中,我们可以通过定义一个自定义的Predicate来实现更复杂的模糊过滤。在这个示例中,我们根据User对象的特定属性来进行过滤。例如,可以使用user.getAge() > 18来过滤出年龄大于18岁的用户。 因此,使用Java Streamfilter方法,我们可以方便地进行模糊过滤,根据不同的需求定义不同的过滤条件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [stream().filter匹配过滤总结](https://blog.csdn.net/zhan107876/article/details/117329626)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cy谭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值