Java 8:如何编写 lambda 流以与 JsonArray 一起使用?

新手上路,请多包涵

我对 Java 8 lambdas 和东西很陌生……我想写一个 lambda 函数,它接受一个 JSONArray ,遍历它的 JSONObject s 并创建一个值列表某个领域。

例如,接受 JSONArray 的函数: [{name: "John"}, {name: "David"}] 并返回 ["John", "David"] 的列表。

我写了以下代码:

 import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

public class Main {
    public static void main(String[] args) {
        JSONArray jsonArray = new JSONArray();
        jsonArray.add(new JSONObject().put("name", "John"));
        jsonArray.add(new JSONObject().put("name", "David"));
        List list = (List) jsonArray.stream().map(json -> json.toString()).collect(Collectors.toList());
        System.out.println(list);
    }
}

但是,我收到一个错误:

线程“main”中的异常 java.lang.NullPointerException

你知道如何解决吗?

原文由 CrazySynthax 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

JSONArrayjava.util.ArrayList 的子类, JSONObjectjava.util.HashMap 的子类。

因此, new JSONObject().put("name", "John") 返回与键关联的先前值( null ),而不是 JSONObject 实例。结果, null 添加到 JSONArray

另一方面,这有效:

     JSONArray jsonArray = new JSONArray();
    JSONObject j1 = new JSONObject();
    j1.put ("name", "John");
    JSONObject j2 = new JSONObject();
    j2.put ("name", "David");
    jsonArray.add(j1);
    jsonArray.add(j2);
    Stream<String> ss = jsonArray.stream().map (json->json.toString ());
    List<String> list = ss.collect (Collectors.toList ());
    System.out.println(list);

出于某种原因,我不得不将流管道分成两步,否则编译器无法识别 .collect (Collectors.toList()) 返回 List

输出是:

 [{"name":"John"}, {"name":"David"}]

原文由 Eran 发布,翻译遵循 CC BY-SA 3.0 许可协议

尝试使用 IntStream。

 List<String> jsonObject = IntStream
       .range(0,jsonArray.size())
       .mapToObj(i -> jsonArray.getJSONObject(i))
       .collect(Collectors.toList());

原文由 Adrian 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题