Java使用Predicate过滤集合中的元素的操作方法
前言
从 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 InheritableThreadLocal使用示例详解
InheritableThreadLocal继承了ThreadLocal,此类扩展了ThreadLocal以提供从父线程到子线程的值的继承:当创建子线程时,子线程接收父线程具有的所有可继承线程局部变量的初始值。 通常子线程的值与父线程的值是一致的2022-09-09
Spring Data JPA实现查询结果返回map或自定义的实体类
这篇文章主要介绍了Spring Data JPA实现查询结果返回map或自定义的实体类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12


最新评论