Die hier genannten Lösungen funktionieren, aber sie mutieren Objekte außerhalb des Streams-Kontexts, die vermieden werden sollten.
Also statt .forEach()
verwenden, die eine abschließende Operation void
zurückgibt. Der richtige Ansatz wäre, .map()
zu verwenden, der, wie der Name sagt, einen Wert einem anderen zuordnet. In Ihrem Fall besteht die erste Operation darin, eine Person einem JSONObject zuzuordnen. Die zweite Operation ist eine Reducer-Funktion, bei der Sie alle JSONObjects auf ein JSONArray-Objekt reduzieren möchten.
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);
}
Leider hat die json.org-Implementierung von JSONArray keine Möglichkeit, zwei Arrays einfach zusammenzuführen. Also habe ich, anstatt auf ein JSONArray zu reduzieren, zuerst alle JSONObjects als Liste gesammelt und daraus ein JSONArray erstellt.
Die Lösung sieht noch schöner aus, wenn Sie den Lambda-Ausdruck durch eine Methodenreferenz ersetzen.
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;
}
Wenn Sie mehr Elemente haben, verwenden Sie parallelStream statt Stream – user121290
http://StackOverflow.com/Questions/20375176/Sould-I-Always-use-a-parallel-stream-when-possible - nein, nicht nur willy nilly verwenden ein paralleler Strom! – Aerus
Ich weiß nicht, warum ich dachte, dass die ForEach-Funktion Lambda-Argumente benötigt. Vielen Dank! – obesechicken13