1.13 Predicate操作Collection集合
使用Java 8新增的Predicate操作Collection集合
Java 8 起為 Collection 集合新增了一個 removeIf(Predicate filter) 方法,該方法將會批量刪除符合 filter 條件的所有元素。該方法需要一個 Predicate 對象作為參數,Predicate 也是函數式接口,因此可使用 Lambda 表達式作為參數。
如下程序示范了使用 Predicate 來過濾集合。
import java.util.Collection; import java.util.HashSet; import java.util.Iterator;public class Test {public static void main(String[] args) {//創建一個集合Collection objs=new HashSet();objs.add("111111111");objs.add("22222222");objs.add("3333333");objs.add("444444");objs.add("55555");objs.removeIf(ele -> ((String)ele).length()<=6);System.out.println(objs);}}上面程序中 objs.removeIf(ele -> ((String)ele).length()<=6);調用了 Collection 集合的 removeIf() 方法批量刪除集合中符合條件的元素,程序傳入一個 Lambda 表達式作為過濾條件。所有長度小于6 的字符串元素都會被刪除。編譯、運行這段代碼,可以看到如下輸出:
[3333333, 111111111, 22222222]
使用 Predicate 可以充分簡化集合的運算,假設 objs 集合,程序有如下三個統計需求:
- 統計集合中出現“英雄聯盟”字符串的數量。
- 統計集合中出現“養爹人”字符串的數量。
- 統計集合中出現字符串長度大于 7 的數量。
此處只是一個假設,實際上還可能有更多的統計需求。如果采用傳統的編程方式來完成這些需求,則需要執行三次循環,但采用 Predicate 只需要一個方法即可。下面代碼示范了這種用法。
import java.util.Collection; import java.util.HashSet; import java.util.function.Predicate;public class Test {public static int calAll(Collection books,Predicate p){int total=0;for(Object obj:books){// 使用Predicate的test()方法判斷該對象是否滿足Predicate指定的條件if(p.test(obj)){total++;}}return total;}public static void main(String[] args) {//創建一個集合Collection objs=new HashSet();objs.add("英雄聯盟佐伊");objs.add("英雄聯盟拉克絲");objs.add("英雄聯盟萬花通靈");objs.add("英雄聯盟時光守護者");objs.add("英雄聯盟峽谷養爹人");// 統計集合中出現“英雄聯盟”字符串的數量System.out.println(calAll(objs, ele -> ((String) ele).contains("英雄聯盟")));// 統計集合中出現“養爹人”字符串的數量System.out.println(calAll(objs, ele -> ((String)ele).contains("養爹人")));// 統計集合中出現字符串長度大于 7 的數量System.out.println(calAll(objs, ele -> ((String) ele).length() > 7));}}輸出結果為:
5 1 3
上面程序先定義了一個 calAll() 方法,它使用 Predicate 判斷每個集合元素是否符合特定條件,條件將通過 Predicate 參數動態傳入。程序傳入了 3 個 Lambda 表達式,其目標類型都是 Predicate,這樣 calAll() 方法就只會統計滿足 Predicate 條件的圖書。
總結
以上是生活随笔為你收集整理的1.13 Predicate操作Collection集合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.11 Lambda表达式遍历Iter
- 下一篇: 1.14 Stream操作Collect