这里提到的解决方案正在工作,但它们在流上下文之外改变对象,这应该避免。
因此,而不是使用.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