2017-06-16 52 views
3

我對Java 8 lambdas和東西很陌生......我想寫一個lambda函數,它需要一個JsonArray,遍歷它的JsonObjects並創建一個特定字段的值列表。Java 8:如何編寫lambda流以使用JsonArray?

例如,使用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); 
    } 
} 

但是,我得到一個錯誤:

Exception in thread "main" java.lang.NullPointerException

你知道如何解決它?

+2

'把()'返回以前的*值*用這個名字,意思是'你的情況null'。 'put()'不是[鏈接方法](https://en.wikipedia.org/wiki/Method_chaining)。 – Andreas

回答

4

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

原始'ArrayList'和'HashMap'是爲什麼'stream()'管道沒有編譯的原因。 –

+0

我認爲它與'JSONArray'擴展了一個原始'ArrayList'有關,但是我認爲'.map(json-> json.toString())'後編譯器可以認識到結果必須是'Stream ',而不管原始原始'流'中元素的類型。 – Eran

+2

我猜它可以_could_,但是'map'從它在原始'Stream'上的調用中立即被擦除。 –