簡體   English   中英

Java 8 使用過濾器 如果 boolean 為真

[英]Java 8 use filter if boolean true

我有對象列表,以及我想查找的其他 object。

讓我們稱之為ProductDtoProduct列表

我想按名稱類型過濾 ProductDtos。 如果存在域代碼- 也按它過濾。

在簡單的 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;
}

它在並行 stream 中的外觀如何?

productDtos.parralelStream()
    .filter(i -> i.getName().equals(product.getName) && // check if type is equal)
    // use filter if isCodePresent 
    .map(...)
    .collect(Collectors.toList());

許多 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);
}

沒有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();
}

過濾條件也有點簡化。

消除不變子表達式:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM