过滤对象的空值

时间:2019-04-01 13:30:30

标签: java

我使用此代码通过ID获取商家名称。

@GetMapping("pages")
public Page<WpfPaymentsDTO> pages(@RequestParam(value = "page") int page, @RequestParam(value = "size") int size) {
    return wpfPaymentsService.findAll(page, size)
                             .filter(g -> g.getMerchant_id() != null)
                             .map(g -> WpfPaymentsDTO.builder()
                             .id(g.getId())
                             .status(g.getStatus())
                             .merchant_id(getMerchantName(g.getMerchant_id()))
                             .build());  
}

private String getMerchantName(Integer id) {      
    return Optional.ofNullable(id)
                   .flatMap(i -> merchantService.findById(i))
                   .map(Merchants::getName)
                   .orElse("");
}

但是当找不到名称时,我得到java.lang.NullPointerException: null at this line: .merchant_id(getMerchantName(g.getMerchant_id())),因为值g.getMerchant_id()null进入数据库。

有没有一种方法可以过滤对象中的几个空值?

2 个答案:

答案 0 :(得分:0)

只需在您的类中创建一个方法,如isValid即可返回布尔值。您可以在方法中添加任何复杂条件。然后在filter中使用该方法。

private boolean isValid() {
   return getMerchent_id() != null &&  getMerchantName(g.getMerchant_id()) != null
 }

现在在过滤器中使用此条件。

return wpfPaymentsService.findAll(page, size)
                         .filter(g -> g.isValid())  

答案 1 :(得分:0)

它只能是getMerchantName(我认为),请再次检查堆栈跟踪。

private String getMerchantName(Integer id) {      
    return Optional.ofNullable(id)
                   .flatMap(i -> merchantService.findById(i))
                   .filter(Objects::nonNull)
                   .map(Merchants::getName)
                   .orElse("");
}

也许是流过度使用的情况。

private String getMerchantName(Integer id) {      
    return id == null ? ""
        : merchantService.findById(id.intValue()) // Stream / Optional?
                   .filter(Objects::nonNull)
                   .map(Merchants::getName)
                   .filter(Objects::nonNull) // When there are null names.
                   .orElse("");
}