Java使用Predicate过滤集合中的元素的操作方法
作者: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过滤集合中元素的资料请关注脚本之家其它相关文章!
