如何在 java 8 流上执行多个操作?

2022-09-03 18:22:09

例如,您有一个要转换为JSONObject的pojo列表。你有一个pojo列表。但是为了转换为 JSONObject,您需要使用 JSONObject put 方法。

JSONObject personJson = new JSONObject();
for(Person person : personList){
   personJson.put("firstName", person.firstName);
   personJson.put("lastName", person.lastname);
   ...
}

如果这只是我想做的一个手术,那么我可以做

personList.stream.map(personJson.put("firstName", person.firstName));

答案 1
 JSONArray array=new JSONArray();
        personList.stream().forEach(element ->
        {
            JSONObject personJson = new JSONObject();
            personJson.put("firstName", element.firstName);
            personJson.put("lastName", element.lastname);
            array.add(personJson);
        });

答案 2

这里提到的解决方案正在工作,但它们正在改变流上下文之外的对象,这应该避免。

因此,与其使用哪个是返回的终止操作,不如使用。正确的方法是使用,就像顾名思义的那样,将一个值映射到另一个值。在你的例子中,你要做的第一个操作是将一个人映射到一个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;
}

推荐