3 回答
TA贡献1851条经验 获得超4个赞
这是我能想到的最好的。我会让你决定它是否更干净:
Optional<Info> oInfo1 = Optional.ofNullable(info1);
oInfo1.map(Info::getId).ifPresent(billing::setSenderId);
oInfo1.map(Info::getPartyNumber).ifPresent(billing::setSenderNumber);
Optional<Info> oInfo2 = Optional.ofNullable(info2);
oInfo2.map(Info::getId).ifPresent(billing::setReceiverId);
oInfo2.map(Info::getPartyNumber).ifPresent(billing::setSellerNumber);
请注意,这与原始字段略有不同,因为即使另一个字段为空,它也可能设置一个字段。
TA贡献1712条经验 获得超3个赞
如果你想用Optional它重写它可能看起来像这样:
Optional.ofNullable(info1)
.filter(i -> i.getId() != null)
.filter(i -> i.getPartyNumber() != null)
.ifPresent(i -> {
billing.setSenderId(info1.getId());
billing.setSenderNumber(info1.getPartyNumber());
});
编辑
info1只有当它不是null并且指定为Optional.filter参数的所有条件都匹配时,我们才处理。因此只有在info1 != nullandinfo1.getId() != null和info1.getPartyNumber() != null的情况下Consumer才会被执行。这是编码多个检查的另一种方法。它做你的代码所做的。
同样的方法适用于info2.
编辑
Optional结合多行符号的流畅 API将每个条件分解为一行。IMO 这使代码易于阅读,从而易于理解。它尽可能保持原始代码的简单性、清晰性,并且仍然以相同的方式运行。
TA贡献1808条经验 获得超4个赞
如果您在源代码中复制代码,则应始终三思而后行。我认为你的测试很好,但我会为它做一个方法,所以你的代码看起来像这样:
if ( isComplete(info1) { .... } if ( isComplete(info2) { .... }
添加回答
举报