为 NullPointerException 编写多个检查代码的替代方法,JAVA 8



有没有更好的方法来在JAVA 8中编写代码?

if (info1 != null && info1.getId() != null && info1.getPartyNumber()!= null) {
billing.setSenderId(info1.getId());
billing.setSenderNumber(info1.getPartyNumber());
}
if (info2 != null && info2.getId() != null && info2.getPartyNumber()!= null) {
billing.setReceiverId(info2.getId());
billing.setSellerNumber(info2.getPartyNumber());            
}
..
..

提前谢谢。 注意:我调查了Optional.ofNullable()但不确定这是否真的可以帮助这里进行多次检查?

这是我能想到的最好的。我会让你决定它是否更干净:

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);

请注意,这与原始字段略有不同,因为它可以设置一个字段,即使另一个字段为 null。

如果你想用Optional重写它,它可能看起来像这样:

Optional.ofNullable(info1)
.filter(i -> i.getId() != null)
.filter(i -> i.getPartyNumber() != null)
.ifPresent(i -> {
billing.setSenderId(info1.getId());
billing.setSenderNumber(info1.getPartyNumber());
});

编辑

仅当info1null且指定为Optional.filter参数的所有条件都匹配时,我们才会处理该。因此,只有在info1 != nullinfo1.getId() != nullinfo1.getPartyNumber() != null的情况下,才会执行Consumer。这是对多个检查进行编码的另一种方法。它执行您的代码所执行的操作。

同样的方式也适用于info2

编辑

流畅的OptionalAPI 与多行符号相结合,将每个条件分解为自己的行。IMO 这使得代码易于阅读,因此易于理解。它尽可能保持原始代码的简单性和清晰度,并且仍然以相同的方式运行。

如果你在源代码中复制代码,你应该总是三思而后行。我认为你的测试很好,但我会为它制定一种方法,所以你的代码看起来像这样:

if ( isComplete(info1( { .... } if ( isComplete(info2( { .... }

如果你的多次重复遵循一个精确的模式(例如,每个奇数重复设置一个receiver,否则sender(,或者这个模式可以提取到Set<Integer>,你可以使用Map<Integer, Info>,其中键是Info的ID,遍历它并仅设置选定的项目。

List<Info> list = ...                                             // List of Info
Map<Integer, Info> map = list.stream()                            // Stream
.filter(Objects::nonNull)                                     // Filter null values
.filter(i -> i.getId() != null && i.getPartyNumber() != null) // Filter null fields
.collect(Collectors.toMap(Info::getId, i -> i));              // Collect to Map<Integer, Info>
for (int i=0; i<10; i++) {                                        // The number of repetitions
if (map.containsKey(i)) {                                     // If the ID was not filtered
Info info = map.get(i);                                   // Get the Info
// Here the pattern comes
if (i % 2 == 0) {                                         // you can either compare with a
// predefined Set of IDs
billing.setSenderId(info.getId());                    
billing.setSenderNumber(info.getPartyNumber());       // Sender
} else { 
billing.setReceiverId(info.getId());                  // Receiver
billing.setSellerNumber(info.getPartyNumber());          
}
}
}

解决方案会有所不同,具体取决于可能设置的数量以及senderreceiver.此外,模式的计算可能基于不同的逻辑 - 我建议针对 ex 进行验证。Set<Integer> senders将包含适合设置为发送方的 ID,接收方和其他可能性也是如此。

  • 优点
    • 无论迭代的Info数量如何,解的长度都保持不变(除了收集输入list的所有Info(。
    • 避免臃肿的代码和重复。
  • 缺点
    • 您必须考虑计算和逻辑以区分要设置的内容。
    • 可能看起来凌乱且难以阅读。

相关内容

  • 没有找到相关文章

最新更新