使用 Java 8 可选的 JSONObject?

Using Java 8 Optional with JSONObject?

给定:

JSONObject o = <populated from json source>;

if (o.has("stuff") && response.getJSONObject("stuff").has("stuffList")  
      && o.getJSONObject("stuff").getJSONArray("stuffList").size() > 0) {
  doStuff()
}

提问: 我如何使用 java.util.Optional 重写上面的内容,这样我就不必进行所有这些 JSONObject 检查?

类似于:

java.util.Optional<JSONObject> _O = java.util.Optional.ofNullable(o);
java.util.Optional<Integer> size = _response.map(JSONObject::getJSONObject("stuffList")...<etc>???;

if (size.IsPresent && size > 0) { doStuff(); }

在这种情况下,它不能很好地重构为 Optionals。 为什么?

getJSONObject() 方法永远不会 return null。如果没有与提供的键关联的值,它将抛出 JSONException。可选的 monad 是为处理空值而不是异常而设计的。在这种情况下,这些检查是必要的。


但是,出于教育目的,我们假设如果没有值存储在指定的键下,方法将 return 为 null。 您可以像这样重构它:

Optional.ofNullable(response.getJSONObject("stuff"))
            .map(stuff -> stuff.getJSONArray("stuffList"))
            .filter(array -> array.length() > 0)
            .ifPresent((array) -> doStuff(array)); // replaceable with a method reference