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

Cra*_*hax 13 java lambda java-8 java-stream

我对 Java 8 lambdas 和其他东西很陌生……我想编写一个 lambda 函数,它接受 a JSONArray,遍历它的JSONObjects 并创建某个字段的值列表。

例如,一个函数接受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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到一个错误:

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

你知道如何解决吗?

小智 12

尝试使用 IntStream。

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


Era*_*ran 4

JSONArray是 的子类java.util.ArrayListJSONObject是 的子类java.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);
Run Code Online (Sandbox Code Playgroud)

由于某种原因,我必须将流管道分为两个步骤,因为否则编译器无法识别.collect (Collectors.toList())返回List.

输出是:

[{"name":"John"}, {"name":"David"}]
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于 org.json.jsonarray 类型,除非您专门从 json-simple jsonarray 进行转换。 (3认同)
  • 原始的“ArrayList”和“HashMap”是“stream()”管道无法编译的原因。 (2认同)
  • 我猜它_可以_,但是“map”在原始“Stream”上的调用中会立即被删除。 (2认同)