9

我有一個List<Object>,我想返回它找到的與謂詞匹配的第一個值。Java中使用謂詞的CollectionUtils

我發現我可以使用CollectionUtils.find(collection,predicate)(Apache commons)。假設Object包含一個名爲:value的整數變量,我如何在謂詞中指定該值可以是1,2,3,4,5,並丟棄那些不匹配的值。是否有可能做'包含'。

還沒有使用java 8所以無法做到流。

+0

apache commons .. – 2014-09-01 13:11:58

回答

22

要在給定的謂詞相匹配的列表中返回的第一個元素Predicate<MyObject>是一樣的。

+0

我以爲OP想要過濾列表(拋棄那些不匹配的列表)。您只是找到與謂詞匹配的第一個對象。 – Dici 2014-09-01 13:16:01

+4

值得注意的是,通用的Predicate只存在於版本4 – blgt 2014-09-01 13:16:31

+0

@Dici中,你可能是對的。我不是100%確定OP想要做什麼...... – 2014-09-01 13:17:16

0

您可以使用Collections.removeIf(我假設您使用的是JDK 8)。你也可以使用一個流:

list = list.stream().filter(predicate).collect(Collectors.toList()); 

使用APACH共享集合,你可以使用CollectionUtils.filter

+0

不幸的是,我不是,這就是爲什麼我選擇使用CollectionUtils。 – 2014-09-01 13:10:02

5

在Java 8,你可以寫

Optional<Integer> found = list.stream().filter(i -> i >= 1 && i <= 5).findAny(); 

的Java 7之前,最簡單的解決方法是使用一個循環。

Integer found = null; 
for(integer i : list) 
    if (i >= 1 && i <= 5) { 
     found = i; 
     break; 
    } 

這將是最簡潔最快捷的方式,因爲Java 7不支持lambda表達式。

MyObject res = CollectionUtils.find(myList, new Predicate<MyObject>() { 
    @Override 
    public boolean evaluate(MyObject o) { 
     return o.getValue() >= 1 && o.getValue() <= 5; 
    } 
}); 

要過濾列表,使其僅包含匹配的斷言元素:

CollectionUtils.filter(myList, new Predicate<MyObject>() { 
    @Override 
    public boolean evaluate(MyObject o) { 
     return o.getValue() >= 1 && o.getValue() <= 5; 
    } 
}); 

你可以注意到