使用列表

时间:2017-09-13 11:46:49

标签: java java-8 java-stream

我有一个“项目”列表,每个项目都有item.posts属性(这是一个后期实例列表)。

我想通过两个属性过滤我的“item”列表:

如果“item.isBig”以及项目的任何帖子已启用,则收集返回的Stream

但是,我不知道如何使用“i.getPosts#isEnabled”执行“anyMatch”。

items.stream()
     .filter(Item::isBig)
     .anyMatch(i.getPosts()->p.isEnabled) // this does not work
     .collect(Collectors.toList());

1 个答案:

答案 0 :(得分:8)

anyMatch是一项终端操作,因此您无法将其与collect结合使用。

您可以应用两个过滤器:

List<Item> filtered = 
    items.stream()
        .filter(Item::isBig)
        .filter(i -> i.getPosts().stream().anyMatch(Post::isEnabled))
        .collect(Collectors.toList());

或将它们组合成一个过滤器:

List<Item> filtered = 
    items.stream()
         .filter(i -> i.isBig() && i.getPosts().stream().anyMatch(Post::isEnabled))
         .collect(Collectors.toList());