這裏提到的解決方案正在工作,但它們在流上下文之外改變對象,這應該避免。
因此,而不是使用.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;
}
如果你有更多的元素使用parallelStream,而不是流 – user121290
http://stackoverflow.com/questions/20375176/should-i-always-use-a-parallel-stream-when-possible-不,不只是無法使用平行流! – Aerus
我不知道爲什麼我認爲forEach函數需要lambda參數。謝謝! – obesechicken13