2017-02-21 50 views
4

例如,您有一個要轉換爲JSONObject的pojo列表。你有一個pojo的列表。但爲了轉換爲JSONObject,你需要使用JSONObject put方法。你將如何做一個java 8流的多個操作?

JSONObject personJson = new JSONObject(); 
for(Person person : personList){ 
    personJson.put("firstName", person.firstName); 
    personJson.put("lastName", person.lastname); 
    ... 
} 

如果只是一個操作我想做的事,然後我可以做

personList.stream.map(personJson.put("firstName", person.firstName)); 

回答

3
JSONArray array=new JSONArray(); 
     personList.stream().forEach(element -> 
     { 
      JSONObject personJson = new JSONObject(); 
      personJson.put("firstName", element.firstName); 
      personJson.put("lastName", element.lastname); 
      array.add(personJson); 
     }); 
+0

如果你有更多的元素使用parallelStream,而不是流 – user121290

+5

http://stackoverflow.com/questions/20375176/should-i-always-use-a-parallel-stream-when-possible-不,不只是無法使用平行流! – Aerus

+0

我不知道爲什麼我認爲forEach函數需要lambda參數。謝謝! – obesechicken13

2
personList.forEach(person -> 
    { 
    personJson.put("firstName",person.firstName); 
    personJson.put("lastName", person.lastName); 
    }); 
+2

歡迎來到Stack Overflow!儘管您可能已經解決了此用戶的問題,但僅有代碼的答案對於未來出現此問題的用戶來說並不是很有幫助。請編輯您的答案,以解釋爲什麼您的代碼可以解決原始問題。 –

+1

然後請格式化您的代碼。 –

1

這裏是工作的代碼爲您返回一個JSON陣列。

import java.util.Arrays; 
import java.util.List; 

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

public class JsonDemo { 
    public static void main(String[] args) { 

     JSONArray jsonArray = new JSONArray(); 
     List<Person> persons = Arrays.asList(new Person("Mike", "Clark"), new Person("Stephen", "Dickens")); 
     persons.stream().forEach(p -> { 
      JSONObject responseDetailsJson = new JSONObject(); 
      responseDetailsJson.put("firstName", p.getFirstName()); 
      responseDetailsJson.put("lastName", p.getLastName()); 
      jsonArray.put(responseDetailsJson); 
     }); 

     System.out.println(jsonArray.toString()); 
    } 

} 


public class Person { 
    private String firstName; 

    private String lastName; 

    public Person(String firstName, String lastName) { 
     super(); 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

} 

希望這會有所幫助。快樂的編碼!

1

@rathna的解釋是正確的。當您發現自己輸入collection.stream().forEach()時,應將其摺疊爲collection.forEach()

1

這裏提到的解決方案正在工作,但它們在流上下文之外改變對象,這應該避免。

因此,而不是使用.forEach()這是一個終止操作返回void。正確的做法是使用.map(),正如名稱所述,它將一個值映射到另一個值。在你的情況下,你想要做的第一個操作是將一個Person映射到一個JSONObject。第二個操作是一個reducer函數,您要將所有JSONObjects簡化爲一個JSONArray對象。

public JSONArray mapListToJsonArray(List<Person> persons) { 
    List<JSONObject> jsonObjects = persons 
      .stream() 
      .map(person -> { 
       JSONObject json = new JSONObject(); 
       json.put("firstName", person.getFirstName()); 
       json.put("lastName", person.getLastName()); 
       return json; 
      }) 
      .collect(Collectors.toList()); 
    return new JSONArray(jsonObjects); 
} 

不幸的是,JSONArray的json.org實現沒有辦法輕鬆地合併兩個數組。所以我不是簡化爲JSONArray,而是首先將所有JSONObjects收集爲一個List,並從中創建一個JSONArray。

如果用方法引用替換lambda表達式,該解決方案看起來更好。

public JSONArray mapListToJsonArray(List<Person> persons) { 
    List<JSONObject> jsonObjects = persons 
      .stream() 
      .map(this::mapPersonToJsonObject) 
      .collect(Collectors.toList()); 
    return new JSONArray(jsonObjects); 
} 

public JSONObject mapPersonToJsonObject(Person person) { 
    JSONObject json = new JSONObject(); 
    json.put("firstName", person.getFirstName()); 
    json.put("lastName", person.getLastName()); 
    return json; 
}