我使用此代码通过ID获取商家名称。
@GetMapping("pages")
public Page<WpfPaymentsDTO> pages(@RequestParam(value = "page") int page, @RequestParam(value = "size") int size) {
return wpfPaymentsService.findAll(page, size)
.map(g -> WpfPaymentsDTO.builder()
.id(g.getId())
.status(g.getStatus())
.merchant_id(getMerchantName(g.getMerchant_id()))
.build());
}
private String getMerchantName(int id) {
Optional<Merchants> obj = merchantService.findById(id);
return obj.get().getName();
}
但是当找不到名称时,我在这行得到java.lang.NullPointerException: null
:.merchant_id(getMerchantName(g.getMerchant_id()))
有什么方法可以设置空字符串,并且在找不到对象时不破坏代码?
答案 0 :(得分:2)
代替调用obj.get().getName()
,请使用更多可选方式,例如:
obj.map(Merchants::getName).orElse("");
,如果找不到Merchants
,它将返回空字符串。您可以将上面代码中的""
更改为更适合您情况的其他任何默认值。
如果g.getMerchant_id()
可以是null
,则下面的代码也可以解决这种情况:
private String getMerchantName(Integer id) {
return Optional.ofNullable(id)
.flatMap(i -> merchantService.findById(i))
.map(Merchants::getName)
.orElse(<default value>);
}
它将把id
变成可选的,所以当它变成null
时,此代码将只返回<default value>
,否则它将使用id
查找Merchants
并然后得到它的名字。 flatMap
在这里用于删除嵌套的可选内容。
答案 1 :(得分:1)
private String getMerchantName(int id) {
Optional<Merchants> obj = merchantService.findById(id);
return obj.isPresent() ? obj.get().getName() : "";
}
答案 2 :(得分:1)
如果名称为null,则可以返回一个空字符串以避免NPE
:
private String getMerchantName(int id) {
Optional<Merchants> obj = merchantService.findById(id);
return obj.isPresent() ? obj.get().getName() : "";
}
然后方法merchant_id
应该处理一个空字符串,并可能引发异常(例如,IllegalArgumentException
)。
答案 3 :(得分:0)
我认为我们可以在返回该对象之前确定该对象是否为空