如何通过Java 8 Predicate仅过滤特定元素?

时间:2017-10-16 14:49:31

标签: java java-8 java-stream

我有List<Foo>Foo元素的集合:

class Foo {
  private TypeEnum type;
  private int amount;

  //getters, setters ...
}

Foo类型可以是TypeEnum.ATypeEnum.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

1 个答案:

答案 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

在您之前的尝试中,只有当truetypeTypeEnum.B大于0时,您的谓词才为amount - 这就是您只有TypeEnum.B的原因返回。

编辑:您还可以在评论部分查看Holger的建议(与他分享一些学分),并使用更短的表达版本:

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