java-8 - 将 Java 8 Optional 与 JSONObject 一起使用?

标签 java-8 option-type json

给定:

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


但是,出于教育目的,我们假设如果指定键下没有存储值,方法将返回 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

关于java-8 - 将 Java 8 Optional 与 JSONObject 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29053642/

相关文章:

swift - 当 ElementOfResult 被推断为 Optional 时,flatMap 不会过滤掉 nil

swift - 强制执行函数参数必须是可选的

java - DateTimeFormatter 无法在 Java 8 中解析秒后带小数点 0 的日期

java - 如何使用箭头符号(->)创建 protected 方法?

Java 流 - 在可空列表上进行流式处理的优雅方式

json - 如何将JSON转换为存储对象?

json - 使用 XSLT 1.0 版从 JSON 文件中提取信息

java - Json 显示列表中对象的名称

java - 从 Java 源代码调用用 Java 编写的脚本

java - 有没有更好的方法从 Java 8 中的 ArrayList 中删除多个项目并移动索引