这里提到的解决方案正在工作,但它们正在改变流上下文之外的对象,这应该避免。
因此,与其使用哪个是返回的终止操作,不如使用。正确的方法是使用,就像顾名思义的那样,将一个值映射到另一个值。在你的例子中,你要做的第一个操作是将一个人映射到一个JSONObject。第二个操作是一个化简器函数,您希望将所有 JSONObjects 简化为一个 JSONArray 对象。.forEach()
void
.map()
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收集为列表,并从中创建了一个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;
}