2017-09-13 36 views
4

我有一个“项目”列表和每个项目都有item.posts属性(这是一个post-instances列表)。用列表流anyMatch

我想两个属性筛选我的“项目” -list:

如果“item.isBig”,如果启用了项目的任何职位,然后收集返回Stream

但是,我不知道如何做“anyMatch”与“i.getPosts#isEnabled”。

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

回答

7

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());