如何在Java 8流中执行多个操作?

15

您有一个POJO列表,想将其转换为JSONObject。您有一个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));
4个回答

13
 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);
        });

如果您有更多的元素,请使用parallelStream而不是stream。 - Karthik Bharadwaj
7
不要随意使用并行流!这篇文章讨论了是否应该总是在可能的情况下使用并行流。 - Aerus
我不知道为什么我认为forEach函数需要lambda参数。谢谢! - obesechicken13

12

这里提到的解决方案虽然可行,但它们会在流上下文之外改变对象,应该避免这种情况。

因此,不要使用返回void的终止操作.forEach()。正确的方法是使用.map(),正如其名称所示,将一个值映射到另一个值。在您的情况下,您想要执行的第一个操作是将Person映射为JSONObject。第二个操作是一个reducer函数,您想要将所有的JSONObject减少为一个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);
}

不幸的是,json.org实现的JSONArray没有一种容易合并两个数组的方法。所以我没有将其减少到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;
}

3
personList.forEach(person ->   
   {
     personJson.put("firstName",person.firstName);
     personJson.put("lastName", person.lastName);
  });

3
欢迎来到 Stack Overflow!虽然您可能已经解决了这位用户的问题,但仅提供代码的答案对于未来查看此问题的用户并不太有帮助。请编辑您的答案,解释为什么您的代码可以解决原始问题。 - Joe C

2
@rathna的解释是正确的。当你发现自己在输入collection.stream().forEach()时,应该将其简化为collection.forEach()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接