Java使用Predicate过滤集合中的元素的操作方法

 更新时间:2025年11月07日 08:59:05   作者:Cache技术分享  
文章介绍了Java 8中Collection接口新增的removeIf方法,该方法允许通过Predicate条件快速移除集合中不符合条件的元素,与传统使用Iterator和remove()方法相比,removeIf方法更加简洁和易读,文章还提供了使用removeIf方法的示例,需要的朋友可以参考下

前言

Java SE 8 开始,Collection 接口新增了一个非常实用的方法: 👉 removeIf(Predicate<? super E> filter)

这个方法允许你通过一个条件判断(Predicate),快速、简洁地移除集合中不符合条件的元素

传统做法(Java 7及之前)

以前在 Java 7 或更早的版本中,我们要删除集合中的元素,必须使用 Iterator 配合 remove()

Iterator<String> iterator = strings.iterator();
while (iterator.hasNext()) {
    String s = iterator.next();
    if (s == null || s.isEmpty() || s.length() > 5) {
        iterator.remove();
    }
}

💬 问题: 这种写法虽然可以,但又啰嗦又容易出错(比如忘记正确使用 iterator.remove())。

新时代做法:使用 removeIf()

现在只需要一句话,就可以优雅地实现同样的功能!

示例:过滤掉 null、空字符串、长度大于5的字符串

import java.util.*;
import java.util.function.Predicate;

public class FilterExample {
    public static void main(String[] args) {
        Predicate<String> isNull = Objects::isNull;
        Predicate<String> isEmpty = String::isEmpty;
        Predicate<String> isTooLong = s -> s.length() > 5;
        
        // 组合多个条件
        Predicate<String> shouldRemove = isNull.or(isEmpty).or(isTooLong);

        Collection<String> strings = new ArrayList<>();
        strings.add(null);
        strings.add("");
        strings.add("one");
        strings.add("two");
        strings.add("");
        strings.add("three"); // 长度大于5
        strings.add("hello"); // 正好5个字符,不会被删
        strings.add(null);

        System.out.println("Before filtering: " + strings);

        strings.removeIf(shouldRemove);

        System.out.println("After filtering: " + strings);
    }
}

输出结果

Before filtering: [null, , one, two, , three, hello, null]
After filtering: [one, two, hello]

细节解释

  • Predicate<String> isNull = Objects::isNull; 👉 创建一个判断元素是否为 null 的条件。
  • Predicate<String> isEmpty = String::isEmpty; 👉 判断字符串是否为空(即长度为0)。
  • Predicate<String> isTooLong = s -> s.length() > 5; 👉 判断字符串长度是否大于5。
  • isNull.or(isEmpty).or(isTooLong) 👉 通过 or 方法把多个判断条件组合起来
  • removeIf(shouldRemove) 👉 移除所有符合 shouldRemove 这个条件的元素。

另外一些常见用法示例

1. 删除所有偶数

List<Integer> numbers = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6));
numbers.removeIf(n -> n % 2 == 0);
System.out.println(numbers);  // 输出 [1, 3, 5]

2. 移除所有以特定字母开头的字符串

List<String> names = new ArrayList<>(List.of("Alice", "Bob", "Charlie", "David"));
names.removeIf(name -> name.startsWith("A"));
System.out.println(names);  // 输出 [Bob, Charlie, David]

小结

优点解释
简洁清晰比传统的 Iterator 写法短很多
可读性好业务逻辑(过滤条件)和代码结构分离,易于理解
支持组合通过 and(), or(), negate() 灵活组合多个条件

以上就是Java使用Predicate过滤集合中的元素的操作方法的详细内容,更多关于Java Predicate过滤集合中元素的资料请关注脚本之家其它相关文章!

相关文章

  • Java基础知识之I/O流和File类文件操作

    Java基础知识之I/O流和File类文件操作

    众所周知java语言提供给程序员非常多的包供编程时使用,方便又快捷,下面这篇文章主要给大家介绍了关于Java基础知识之I/O流和File类文件操作的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Java InheritableThreadLocal使用示例详解

    Java InheritableThreadLocal使用示例详解

    InheritableThreadLocal继承了ThreadLocal,此类扩展了ThreadLocal以提供从父线程到子线程的值的继承:当创建子线程时,子线程接收父线程具有的所有可继承线程局部变量的初始值。 通常子线程的值与父线程的值是一致的
    2022-09-09
  • Java提效神器Stream的一些冷门技巧汇总

    Java提效神器Stream的一些冷门技巧汇总

    这篇文章主要给大家介绍了关于Java提效神器Stream的一些冷门技巧,Stream是java对集合操作的优化,相较于迭代器,使用Stream的速度非常快,并且它支持并行方式处理集合中的数据,默认情况能充分利用cpu的资源,需要的朋友可以参考下
    2021-07-07
  • Spring Data JPA实现查询结果返回map或自定义的实体类

    Spring Data JPA实现查询结果返回map或自定义的实体类

    这篇文章主要介绍了Spring Data JPA实现查询结果返回map或自定义的实体类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 详解Java线程池是如何重复利用空闲线程的

    详解Java线程池是如何重复利用空闲线程的

    在Java开发中,经常需要创建线程去执行一些任务,实现起来也非常方便,此时,我们很自然会想到使用线程池来解决这个问题,文中给大家提到使用线程池的好处,对Java线程池空闲线程知识感兴趣的朋友一起看看吧
    2021-06-06
  • 浅谈从Java中的栈和堆,进而衍生到值传递

    浅谈从Java中的栈和堆,进而衍生到值传递

    这篇文章主要介绍了浅谈从Java中的栈和堆,进而衍生到值传递,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Mybatis-Plus乐观锁配置流程

    Mybatis-Plus乐观锁配置流程

    这篇文章主要介绍了Mybatis-Plus乐观锁配置使用流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作有一定的参考学习价值,感兴趣的朋友们下面随着小编来一起学习吧
    2024-01-01
  • Java中ArrayList类的源码解析

    Java中ArrayList类的源码解析

    本文主要介绍了Java中ArrayList类的源码解析,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • springboot手动事务回滚的实现代码

    springboot手动事务回滚的实现代码

    这篇文章主要介绍了springboot手动事务回滚的实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java编程实现获取mp3时长及播放mp3文件的方法

    Java编程实现获取mp3时长及播放mp3文件的方法

    这篇文章主要介绍了Java编程实现获取mp3时长及播放mp3文件的方法,涉及java基于jaudiotagger与jl包对MP3音频文件属性操作及音频播放相关操作技巧,并提供了相关jar包的本站下载,需要的朋友可以参考下
    2018-02-02

最新评论