【问题标题】:Java Optional: how to do with long map() chainJava 可选:如何处理长 map() 链
【发布时间】:2019-01-29 10:28:25
【问题描述】:

最近,我开始在我们的项目中处理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() 方法中的任何一个返回 null 值,我将得到一个空的 Optional 作为表达式的结果。比方说,使用一个“安全盒”,所有可能的 null 值都可以通过某种方式处理并变成空的 Optional。这是一个愚蠢的想法吗?

有没有办法让代码不那么冗长?

【问题讨论】:

  • 你可以在map里面使用&&

标签: java optional


【解决方案1】:

将其封装在一个方法中:

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

【讨论】:

  • isPresent() 的检查提前一行不是更有意义吗?
  • @CommonMan 这个答案不是很冗长吗?它是可重用的,可用于任意大的paths 数组。它有效地将所有map(...) 调用转换为一个简单的可变参数。
  • @CommonMan 不,它没有。或者 OP 更喜欢对常用词有自己的定义。
  • @Tom 偶然发现了这个:(它是正确的??)softwareengineering.stackexchange.com/questions/141175/…
  • @CommonMan 将内容提取到方法中的要点是,您在定义方法时支付了冗长的成本,然后为您添加的每个后续调用降低了冗长。如果您愿意,可以通过定义这样的方法来减少边际冗长,即使最初的冗长支出相当或更高。
猜你喜欢
  • 2012-07-26
  • 2019-04-03
  • 2021-11-18
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
相关资源
最近更新 更多