Java使用Predicate過濾集合中的元素的操作方法
前言
從 Java SE 8 開始,Collection 接口新增了一個(gè)非常實(shí)用的方法: ?? removeIf(Predicate<? super E> filter)
這個(gè)方法允許你通過一個(gè)條件判斷(Predicate),快速、簡潔地移除集合中不符合條件的元素。
傳統(tǒng)做法(Java 7及之前)
以前在 Java 7 或更早的版本中,我們要?jiǎng)h除集合中的元素,必須使用 Iterator 配合 remove():
Iterator<String> iterator = strings.iterator();
while (iterator.hasNext()) {
String s = iterator.next();
if (s == null || s.isEmpty() || s.length() > 5) {
iterator.remove();
}
}
?? 問題: 這種寫法雖然可以,但又啰嗦又容易出錯(cuò)(比如忘記正確使用 iterator.remove())。
新時(shí)代做法:使用 removeIf()
現(xiàn)在只需要一句話,就可以優(yōu)雅地實(shí)現(xiàn)同樣的功能!
示例:過濾掉 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;
// 組合多個(gè)條件
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個(gè)字符,不會(huì)被刪
strings.add(null);
System.out.println("Before filtering: " + strings);
strings.removeIf(shouldRemove);
System.out.println("After filtering: " + strings);
}
}
輸出結(jié)果:
Before filtering: [null, , one, two, , three, hello, null] After filtering: [one, two, hello]
細(xì)節(jié)解釋
Predicate<String> isNull = Objects::isNull;?? 創(chuàng)建一個(gè)判斷元素是否為null的條件。Predicate<String> isEmpty = String::isEmpty;?? 判斷字符串是否為空(即長度為0)。Predicate<String> isTooLong = s -> s.length() > 5;?? 判斷字符串長度是否大于5。isNull.or(isEmpty).or(isTooLong)?? 通過or方法把多個(gè)判斷條件組合起來。removeIf(shouldRemove)?? 移除所有符合shouldRemove這個(gè)條件的元素。
另外一些常見用法示例
1. 刪除所有偶數(shù)
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]
小結(jié)
| 優(yōu)點(diǎn) | 解釋 |
|---|---|
| 簡潔清晰 | 比傳統(tǒng)的 Iterator 寫法短很多 |
| 可讀性好 | 業(yè)務(wù)邏輯(過濾條件)和代碼結(jié)構(gòu)分離,易于理解 |
| 支持組合 | 通過 and(), or(), negate() 靈活組合多個(gè)條件 |
以上就是Java使用Predicate過濾集合中的元素的操作方法的詳細(xì)內(nèi)容,更多關(guān)于Java Predicate過濾集合中元素的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用spring整合Quartz實(shí)現(xiàn)—定時(shí)器功能
這篇文章主要介紹了使用spring整合Quartz實(shí)現(xiàn)—定時(shí)器功能,不基于特定的基類的方法,需要的朋友可以參考下2018-04-04
Spring事務(wù)@Transactional失效的8大場景與解決方法
在我們開發(fā)Spring Boot應(yīng)用中,很多小伙伴以為只要在方法上加一個(gè) @Transactional,但實(shí)際開發(fā)中,事務(wù)經(jīng)常出現(xiàn)失效的情況,下面我們就來看看如何解決吧2025-08-08
SpringBoot項(xiàng)目集成License授權(quán)與續(xù)期完整指南
SpringBoot項(xiàng)目中,通過引入第三方spring-boot-starter-license組件,可以快速實(shí)現(xiàn)系統(tǒng)權(quán)限到期控制、License 證書管理等功能,具有一定的參考價(jià)值,感興趣的可以了解一下2025-07-07
Springboot Controller接口默認(rèn)自動(dòng)填充業(yè)務(wù)實(shí)體參數(shù)值詳解
這篇文章主要介紹了Springboot Controller接口默認(rèn)自動(dòng)填充業(yè)務(wù)實(shí)體參數(shù)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-05-05

