繁体   English   中英

在多级 POJO 的可选方法链中找到 null 类型的名称(通过 map 操作)

[英]Find null Type's name in Optional method chain(through map operation) for multilevel POJO

我有类似的 class 结构。

class Request {
    Level1 level1;
}

class Level1 {
    Level2 level2;
    String data;
}

class Level2 {
    Level3 level3;
    String data;
}

class Level3 {
    Level4 level4;
    String data;
}

class Level4 {
    String data;
}







Request r = new Request();
        r.level1 = new Level1();
        r.level1.level2 = new Level2();
        r.level1.level2.level3 = null;//new Level3();
        //r.level1.level2.level3.level4 = new Level4();
        //r.level1.level2.level3.level4.data = "level4Data";

并从我做的嵌套字段中获取数据
使用 Optional 的好处是我不必担心在 object 层次结构中的每个级别检查 null

String level4Data = Optional.ofNullable(r)
                            .map(req -> req.level1)
                            .map(l1 -> l1.level2)
                            .map(l2 -> l2.level3)
                            .map(l3 -> l3.level4)
                            .map(l4 -> l4.data)
                            .orElse(null);
System.out.println("level4Data: " + level4Data);

但是如果我想再次记录 level4Data 背后的原因是 null,我必须做以下事情/我没有更好

if (level4Data == null) {
    if (r == null) System.out.println("request was null");
    else if (r.level1 == null) System.out.println("level1 was null");
    else if (r.level1.level2 == null) System.out.println("level2 was null");
    else if (r.level1.level2.level3 == null) System.out.println("level3 was null");
    else if (r.level1.level2.level3.level4 == null) System.out.println("level4 was null");
    else if (r.level1.level2.level3.level4.data == null) System.out.println("level4.data was null");
}

是否有更优雅/有效的方式来做到这一点,因为它首先破坏了使用 Optional 的好处

感谢您的时间和投入

Optional 没有像Stream API那样的peek方法。

对于您的用例,您可以编写一个包装器来完成额外的工作:

// logging wrapper

static <T, R> Function<T, R> logIfNull(Function<? super T, ? extends R> function, String message) {
  return input -> {
      R result;
      if ((result = function.apply(input)) == null)
          System.out.println("logIfNull :: Null found. " + message);
      return result;
  };
}

// usage
String level4Data = Optional.ofNullable(r)
       .map(logIfNull(req -> req.level1, "req.level1"))
       .map(logIfNull(l1 -> l1.level2, "l1.level2"))
       .map(logIfNull(l2 -> l2.level3, "l2.level3"))
       .map(logIfNull(l3 -> l3.level4, "l3.level4"))
       .map(logIfNull(l4 -> l4.data, "l4.data"))
       .orElse(null);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM