2017-10-16 1 views
4

나는 Foo 요소의 컬렉션 List<Foo> 있습니다.Java 8 술어로 특정 요소 만 필터링하는 방법?</p> <pre><code>class Foo { private TypeEnum type; private int amount; //getters, setters ... } </code></pre> <p><code>Foo</code> 유형 <code>TypeEnum.A</code> 및 <code>TypeEnum.B</code> 될 수 있습니다

목록에서 해당 요소가 type == TypeEnum.B이면 amount이 0보다 큰 (amount > 0) 개의 요소 만 목록에서 가져 오려고합니다.

Java 8 Streams filter() 메서드로 어떻게 할 수 있습니까?

내가 사용하는 경우 :

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

나는 TypeEnum.B은 있지만 TypeEnum.A없이 Foo 요소를 얻을. 이 같은

+2

기다립니다 당신이 둘 다 싶어를'TypeEnum.A '및'TypeEnum.B' 또는 하나만? 당신은 두 가지 변종을 언급합니다. – xander

+0

@xander 예, 둘 다 값을 가져 오려고하지만 그 중 하나는 필터링됩니다. – kuba44

답변

5

시도 뭔가 : i.getAmount() > 0에만 type 경우가 TypeEnum.B 동일한 경우

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

이 확인합니다. 이전 시도에서

은 술어는 typeTypeEnum.Bamount가 0보다 큰 경우에만, true이었다 - 당신은 수익 만 TypeEnum.B있어 그 이유는.

편집 : 당신은 또한 코멘트 섹션에 (그와 함께 약간의 크레딧을 공유)과 표현의도 짧은 버전 사용 Holger에 의해 제안을 확인할 수 있습니다

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

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

+0

@Holger 좋은 제안이 추가되었습니다. –

관련 문제