2017-02-21 4 views
4

У вас есть список pojo, который вы хотите преобразовать в JSONObject, например. У вас есть список 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 требуются аргументы лямбда. Благодаря! – obesechicken13

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

Добро пожаловать в Переполнение стека! Хотя вы, возможно, решили проблему этого пользователя, ответы на код не очень помогают пользователям, которые приходят к этому вопросу в будущем. Измените свой ответ, чтобы объяснить, почему ваш код решает исходную проблему. –

+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. Вторая операция - это функция редуктора, в которой вы хотите уменьшить все 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); 
} 

К сожалению, реализация json.org JSONArray не позволяет легко объединить два массива. Поэтому вместо того, чтобы сводить к JSONArray, я сначала собрал все JSONObjects в виде списка и создал из него JSONArray.

Решение выглядит еще приятнее, если вы замените выражение лямбда ссылкой на метод.

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; 
} 
Смежные вопросы