Java可选:如何处理长map()链

时间:2019-01-29 10:28:26

标签: java optional

最近,我在处理项目中的json响应时开始使用Optional:

Optional.ofNullable(root.get("a"))
        .map(a -> a.get("b"))
        .map(b -> b.get("c"))
        .map(c -> c.get("d"))

对于每个get(),我必须使用map()将返回值保留在“安全框”中,这会使代码变得很冗长。要访问复杂的长json树中的一个非常深的json字段,它将以相当长的map()链结束。

我梦到这样的事情:

Optional.ofNullable(root.get("a")).map(a.get("b").get("c").get("d"))

如果这些get()方法中的任何一个返回空值,则表达式的结果将是空的Optional。假设使用一个“安全框”,可以以某种方式处理所有可能的null值并将其转换为空的Optional。这是一个愚蠢的想法吗?

有没有一种方法可以使代码更简洁?

1 个答案:

答案 0 :(得分:3)

将其包装在方法内部:

static Optional<JsonObject> get(JsonObject root, String... paths) {
  Optional<JsonObject> opt = Optional.ofNullable(root);
  for (String p : paths) {
    if (!opt.isPresent()) break;
    opt = opt.map(a -> a.get(p));
  }
  return opt;
}

然后致电:

Optional<JsonObject> jsonObject = get(root, "a", "b", "c", "d");