2017-02-21 34 views
4

例如,您有一个要转换为JSONObject的pojo列表。你有一个pojo的列表。但为了转换为JSONObject,你需要使用JSONObject put方法。你将如何做一个java 8流的多个操作?

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

回答

3
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); 
     }); 
+0

如果你有更多的元素使用parallelStream,而不是流 – user121290

+5

http://stackoverflow.com/questions/20375176/should-i-always-use-a-parallel-stream-when-possible-不,不只是无法使用平行流! – Aerus

+0

我不知道为什么我认为forEach函数需要lambda参数。谢谢! – obesechicken13

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

欢迎来到Stack Overflow!尽管您可能已经解决了此用户的问题,但仅有代码的答案对于未来出现此问题的用户来说并不是很有帮助。请编辑您的答案,以解释为什么您的代码可以解决原始问题。 –

+1

然后请格式化您的代码。 –

1

这里是工作的代码为您返回一个JSON阵列。

import java.util.Arrays; 
import java.util.List; 

import org.json.JSONArray; 
import org.json.JSONObject; 

public class JsonDemo { 
    public static void main(String[] args) { 

     JSONArray jsonArray = new JSONArray(); 
     List<Person> persons = Arrays.asList(new Person("Mike", "Clark"), new Person("Stephen", "Dickens")); 
     persons.stream().forEach(p -> { 
      JSONObject responseDetailsJson = new JSONObject(); 
      responseDetailsJson.put("firstName", p.getFirstName()); 
      responseDetailsJson.put("lastName", p.getLastName()); 
      jsonArray.put(responseDetailsJson); 
     }); 

     System.out.println(jsonArray.toString()); 
    } 

} 


public class Person { 
    private String firstName; 

    private String lastName; 

    public Person(String firstName, String lastName) { 
     super(); 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

} 

希望这会有所帮助。快乐的编码!

1

@rathna的解释是正确的。当您发现自己输入collection.stream().forEach()时,应将其折叠为collection.forEach()

1

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

因此,而不是使用.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; 
}