我有List<Foo>
个Foo
元素的集合:
class Foo {
private TypeEnum type;
private int amount;
//getters, setters ...
}
Foo
类型可以是TypeEnum.A
和TypeEnum.B
。
我想只从列表中获取Foo
元素,如果元素有type == TypeEnum.B
,则amount
大于零(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());
我的Foo
元素包含TypeEnum.B
但没有TypeEnum.A
。
答案 0 :(得分: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
为type
且TypeEnum.B
大于0时,您的谓词才为amount
- 这就是您只有TypeEnum.B
的原因返回。
编辑:您还可以在评论部分查看Holger的建议(与他分享一些学分),并使用更短的表达版本:
!i.getType().equals(TypeEnum.B) || i.getAmount()>0