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