ここに記載されている解決策は機能していますが、ストリームコンテキスト外のオブジェクトを変更しているため、避けるべきです。
を使用する代わりに、終了操作であるvoid
を返します。正しいアプローチは、.map()
を使用することです。名前のように、1つの値を別の値にマップします。あなたの場合、最初に行う操作はPersonをJSONObjectにマッピングすることです。 2番目の操作は、すべてのJSONObjectを1つの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実装では、残念ながら2つの配列を簡単にマージする方法はありません。だから、私はJSONArrayを減らす代わりに、まずすべてのJSONObjectをListとして収集し、そこからJSONArrayを作成しました。
ラムダ式をメソッド参照に置き換えると、ソリューションがさらに見栄えがよくなります。
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