Java 8:如何编写 lambda 流来使用 JsonArray?

2022-09-03 02:00:44

我对Java 8 lambdas和东西很陌生...我想编写一个 lambda 函数,该函数采用 , 遍历其 s 并创建某个字段的值列表。JSONArrayJSONObject

例如,一个函数,它采用 : 并返回 .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 中的异常

你知道如何解决吗?


答案 1

尝试使用 IntStream。

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

答案 2

JSONArray 是 的子类,JSONObject 是 的子类。java.util.ArrayListjava.util.HashMap

因此,返回与键 () 关联的上一个值,而不是实例。因此,将 添加到 .new JSONObject().put("name", "John")nullJSONObjectnullJSONArray

另一方面,这有效:

    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"}]

推荐