我试图像这样过滤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值进行过滤。我怎么能做到这一点?
答案 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
重复进行检查,避免不必要的捕获或size
和firmness
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检查。