使用List传输anyMatch

nim*_*o23 5 java java-8 java-stream

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

我想通过两个属性过滤我的"item"-list:

如果"item.isBig"并且如果启用了项目的任何帖子,则收集返回的项目Stream.

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

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

Era*_*ran 8

anyMatch是一个终端操作,所以你不能与它结合使用collect.

您可以应用两个过滤器:

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

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

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