在流过滤器中对流使用Java过滤器

时间:2019-08-17 04:52:19

标签: java java-8 java-stream

我有ItemAddress类:

public class Item {
    String name;
    List<Address> address;
}

public class Address {  
    String name;
    String lane;
}

假设我有一个项目列表,并且想过滤具有泳道为"lane1"的项目。

我尝试以下操作,但是在Eclipse中显示:

  

“类型不匹配:无法从流地址转换为布尔值”

items.stream().filter(a->a.getAddress().stream().
      filter(b->b.getLane().equals("lane1"))).collect(Collectors.toList());

2 个答案:

答案 0 :(得分:9)

您可以在内部流上使用anyMatch

items.stream().filter(a->a.getAddress().stream().
      anyMatch(b->"lane1".equals(b.getLane()))).collect(Collectors.toList());

答案 1 :(得分:3)

您将收到类型不匹配错误,因为过滤器必须返回布尔结果,并且在您的情况下,内部流返回的是Stream<Address>而不是布尔值。

因此,如@Sweeper回答的那样,您可以使用anyMatch

// you can directly use predicate in anyMatch 
    Predicate<? super Address> equalsLane1 =  address->address.getLane().equals("lane1");
    List<Item> lane1 = items.stream().filter(ele ->
               ele.getAddress().stream().anyMatch(equalsLane1)).collect(Collectors.toList());