代码之家  ›  专栏  ›  技术社区  ›  CuriousToLearn

编写多个NullPointerException检查代码的另一种方法,java8

  •  0
  • CuriousToLearn  · 技术社区  · 6 年前

    有没有更好的方法在Java8中编写代码?

        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() 但不确定这是否真的有助于多重检查?

    4 回复  |  直到 6 年前
        1
  •  5
  •   shmosel    6 年前

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

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

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

        2
  •  4
  •   halfer    6 年前

    如果你想用 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 != null info1.getId() != null info1.getPartyNumber() != null 这个 Consumer . 它和你的代码一样。

    同样的方法也适用于 info2

    编辑

    可选 与多行表示法相结合,将每个条件分解为一行。这使得代码易于阅读,从而易于理解。它尽可能保持原始代码的简单性和清晰性,并且仍然以相同的方式运行。

        3
  •  0
  •   Hans Lepoeter    6 年前

    如果你在源代码中复制代码,你应该三思而后行。我认为您的测试很好,但我会为它创建一个方法,因此您的代码如下所示:

    } if(isComplete)(信息2) { .... }

        4
  •  0
  •   Nikolas Charalambidis    6 年前

    如果你的多次重复遵循一个确切的模式(例如,每一个奇数重复设置一个 receiver ,否则 sender )或者这个模式可以被提取出来 Set<Integer> Map<Integer, Info> 其中密钥是 Info ,遍历它并仅设置选定的项。

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

    解决方案会有所不同,并且取决于可能的设置数量以及 发件人 接受者 . 另外,模式的计算可能基于不同的逻辑-我建议根据ex进行验证。 Set<Integer> senders 它将包含适合设置为发送方的id,同样适用于接收方和其他可能性。

    • 赞成的意见 :
      • 信息 迭代后,解决方案的长度保持不变(除了收集所有 信息 list ).
      • 避免代码膨胀和重复。
    • 欺骗 :
      • 你必须考虑计算和逻辑来区分要设置什么。
      • 可能看起来很乱很难读。