使用lambda java的多重过滤器

时间:2017-10-03 19:59:30

标签: java lambda filter java-8

我试图像这样过滤java集合:

filtered = products.stream()
                .filter((product) ->size!=null&& 
                 product.getSize().equalsIgnoreCase(size))
                .filter((product) ->firmness!=null  && 
                 product.getFirmness().equalsIgnoreCase(firmness))
                .collect(Collectors.toList());

在这个例子中,我有两个要过滤的变量 - size&坚定性。此变量是可选的,可以为空。 因此,如果我发送两个非空参数代码正在工作并过滤精细,但当我只发送一个参数并将其他参数设置为null - 它不起作用。我需要我的集合通过非空值过滤。因此,如果一个参数为null,而另一个参数为null,则集合必须通过非null值进行过滤。我怎么能做到这一点?

4 个答案:

答案 0 :(得分:3)

&&要求它为非null。使用||反转条件,例如,

size == null || product.getSize().equalsIgnoreCase(size)

如果要避免对每个元素进行null检查,可以将整个lambda放在三元表达式中:

.filter(size == null ? p -> true : p -> p.getSize().equalsIgnoreCase(size))

答案 1 :(得分:1)

像这样的东西,我没有编译它。
在开始管道处理之前,您可以计算Predicate

static  Predicate<Product> predicate(String size, String firmness) {
     if(size != null && firmness != null){
         return p -> p.getSize().equalsIgnoreCase(size) 
                && p.getFirmness().equalsIgnoreCase(firmness);
     } else if(size != null){
         return p -> p.getSize().equalsIgnoreCase(size); 
     } else if(firmness != null){
         return p -> p.getFirmness().equalsIgnoreCase(firmness);
     } else {
         return p -> false;
     }
 }

答案 2 :(得分:0)

<强>更新即可。感谢shmosel的回答,在这个lambda示例中有一种更好的方法可以使用三元运算:

filtered = products.stream()
.filter( size == null ? p -> true : p -> p.getSize().equalsIgnoreCase(size) )
.filter( firmness == null ? p -> true : p -> product.getFirmness().equalsIgnoreCase(firmness) )
.collect( Collectors.toList() );

正如Holger所提到的,将lambda表达式移出null检查将避免对null product重复进行检查,避免不必要的捕获或sizefirmness null filtered = products.stream() .filter( (product) -> size != null ? product.getSize().equalsIgnoreCase(size) : true ) .filter( (product) -> firmness != null ? product.getFirmness().equalsIgnoreCase(firmness) : true ) .collect( Collectors.toList() ); {1}}根据this帮助提高效果。

这是最初的方法:

  goPressed(shareproductid){    
     this.props.navigation.navigate(
      'Products',
      shareproductid,
      console.log(shareproductid)
    );
  }


  <TouchableHighlight onPress={() => this.goPressed(item.p1.shareproductid)} style={styles.button}>
    <Text style={styles.buttonText}>
      Go
    </Text>
  </TouchableHighlight>

答案 3 :(得分:0)

还要查看来自BlobCity java-commons https://blog.blobcity.com/2018/07/15/retainif-and-removeif-for-java-collections-blobcity/CollectionUtil.retainIf(collection, predicate)

CollectionUtil.retainIf(products, product -> product.getSize().equalsIgnoreCase(size));
CollectionUtil.retainIf(products, product -> product.getFirmness().equalsIgnoreCase(firmness));

每次调用都会减少原始列表,以仅保留那些满足谓词条件的值。如果需要,可以在谓词中添加null检查。