it-swarm.com.ru

Java 8: Как написать лямбда-поток для работы с JsonArray?

Я очень новичок в лямбда-выражениях Java 8 и прочем ... Я хочу написать лямбда-функцию, которая принимает 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);
    }
}

Однако я получаю ошибку: 

Исключение в потоке "main" Java.lang.NullPointerException

Знаете ли вы, как решить это? 

4
CrazySynthax

JSONArray является подклассом Java.util.ArrayList и JSONObject является подклассом 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);

По какой-то причине мне пришлось разделить конвейер потока на два шага, потому что в противном случае компилятор не распознает, что .collect (Collectors.toList()) возвращает List.

Результат:

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

Попробуйте с IntStream

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