[英]Java 8 use filter if boolean true
I have list of objects, and other object which i want to find.我有对象列表,以及我想查找的其他 object。
Lets call it List of ProductDto and Product让我们称之为ProductDto和Product列表
I want to filter of ProductDtos by names , and by type .我想按名称和类型过滤 ProductDtos。 And if field code is present - filter also by it.
如果存在域代码- 也按它过滤。
In simple java code it will looks like:在简单的 java 代码中,它将如下所示:
ProductDto find(List<ProductDto> productDtos, Product product) {
for(ProductDto dto : productDtos) {
if(dto.getName.equals(product.getName) && dto.getType.equals(product.getType)) {
boolean isCodePresent = dto.getCode() != null && product.getCode() != null;
if(!isCodePresent) return dto;
else if(isCodePresent && dto .getCode.equals(product.getCode)) return dto;
}
}
return null;
}
How will it looks in parralel stream?它在并行 stream 中的外观如何?
productDtos.parralelStream()
.filter(i -> i.getName().equals(product.getName) && // check if type is equal)
// use filter if isCodePresent
.map(...)
.collect(Collectors.toList());
The many null tests muddle the clearity.许多 null 测试混淆了清晰度。
ProductDto find(List<ProductDto> productDtos, Product product) {
return ProductDts.parallelStream()
.filter(dto -> dto.getName.equals(product.getName)
&& dto.getType.equals(product.getType)
&& ((dto.getCode() == null || product.getCode() == null)
||
(dto.getCode() != null && product.getCode() != null
&& dto.getCode.equals(product.getCode))
))
.findAny().orElse(null);
}
Safer and shorter without orElse
would be:没有
orElse
会更安全、更短:
Optional<ProductDto> find(List<ProductDto> productDtos, Product product) {
return ProductDts.parallelStream()
.filter(dto -> dto.getName.equals(product.getName)
&& dto.getType.equals(product.getType)
&& (dto.getCode() == null) == (product.getCode() == null)
&& (product.getCode() == null || dto.getCode.equals(product.getCode)))
.findAny();
}
Also the filter condition a bit simplified.过滤条件也有点简化。
Eliminating invariant subexpression:消除不变子表达式:
Optional<ProductDto> find(List<ProductDto> productDtos, Product product) {
boolean productCodeNull = product.getCode() == null;
return ProductDts.parallelStream()
.filter(dto -> dto.getName.equals(product.getName)
&& dto.getType.equals(product.getType)
&& (dto.getCode() == null) == productCodeNull
&& (productCodeNull || dto.getCode.equals(product.getCode)))
.findAny();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.