2017-10-16 90 views
4

Foo元素集合List<Foo>如何僅通過Java 8謂詞過濾特定元素?

class Foo { 
    private TypeEnum type; 
    private int amount; 

    //getters, setters ... 
} 

Foo類型可以是TypeEnum.ATypeEnum.B

我想從列表中只得到那些Foo元素,如果元素有type == TypeEnum.B那麼amount大於零(amount > 0)。

如何通過Java 8 Stream filter()方法來實現?

如果我使用:

List<Foo> l = list.stream() 
    .filter(i -> i.getType().equals(TypeEnum.B) && i.getAmount() > 0) 
    .collect(Collectors.<Foo>toList()); 

我得到Foo元素與TypeEnum.B但沒有TypeEnum.A

+2

等待你想同時'TypeEnum.A '和'TypeEnum.B'還是隻有一個?你提到兩個變種。 – xander

+0

@xander是的,我想得到兩個值,但其中一個過濾。 – kuba44

回答

5

嘗試這樣:

List<Foo> l = list.stream() 
     .filter(i -> i.getType().equals(TypeEnum.B) ? i.getAmount() > 0 : true) 
     .collect(Collectors.<Foo>toList()); 

它檢查是否i.getAmount() > 0只有type等於TypeEnum.B

在以前的嘗試你的謂詞是true只有typeTypeEnum.Bamount是大於0 - 這就是爲什麼你得到的回報只有TypeEnum.B

編輯:您還可以檢查Holger提出的建議(與他分享一些學分)在評論部分,並使用表達式的更短的版本:

!i.getType().equals(TypeEnum.B) || i.getAmount()>0 
+9

'!i.getType()。equals(TypeEnum.B)|| i.getAmount()> 0' – Holger

+0

@Holger好的建議,也加上一個參考。 –