2017-02-21 3 views
4

Sie haben eine Liste von Pojo, die Sie beispielsweise in ein JSONObject konvertieren möchten. Sie haben eine Liste von Pojo. Um jedoch in ein JSONObject zu konvertieren, müssen Sie die put-Methode JSONObject verwenden.Wie würden Sie mehrere Operationen in einem Java 8-Stream durchführen?

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

Wenn es nur eine Operation ist ich tun wollte, dann könnte ich tun

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

Antwort

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

Wenn Sie mehr Elemente haben, verwenden Sie parallelStream statt Stream – user121290

+5

http://StackOverflow.com/Questions/20375176/Sould-I-Always-use-a-parallel-stream-when-possible - nein, nicht nur willy nilly verwenden ein paralleler Strom! – Aerus

+0

Ich weiß nicht, warum ich dachte, dass die ForEach-Funktion Lambda-Argumente benötigt. Vielen Dank! – obesechicken13

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

Willkommen bei Stack Overflow! Während Sie das Problem dieses Benutzers möglicherweise gelöst haben, sind Code-Only-Antworten für Benutzer, die in Zukunft auf diese Frage kommen, nicht sehr hilfreich. Bitte bearbeiten Sie Ihre Antwort, um zu erklären, warum Ihr Code das ursprüngliche Problem löst. –

+1

Und bitte formatieren Sie Ihren Code. –

1

Hier ist ein Arbeits Code für Sie einen JSON-Array zurück.

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

} 

Hoffe, das hilft. Glückliche Kodierung!

1

Die Erklärung von @athratna ist korrekt. Wenn Sie collection.stream().forEach() eingeben, sollten Sie dies auf collection.forEach() reduzieren.

1

Die hier genannten Lösungen funktionieren, aber sie mutieren Objekte außerhalb des Streams-Kontexts, die vermieden werden sollten.

Also statt .forEach() verwenden, die eine abschließende Operation void zurückgibt. Der richtige Ansatz wäre, .map() zu verwenden, der, wie der Name sagt, einen Wert einem anderen zuordnet. In Ihrem Fall besteht die erste Operation darin, eine Person einem JSONObject zuzuordnen. Die zweite Operation ist eine Reducer-Funktion, bei der Sie alle JSONObjects auf ein JSONArray-Objekt reduzieren möchten.

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

Leider hat die json.org-Implementierung von JSONArray keine Möglichkeit, zwei Arrays einfach zusammenzuführen. Also habe ich, anstatt auf ein JSONArray zu reduzieren, zuerst alle JSONObjects als Liste gesammelt und daraus ein JSONArray erstellt.

Die Lösung sieht noch schöner aus, wenn Sie den Lambda-Ausdruck durch eine Methodenreferenz ersetzen.

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; 
} 
Verwandte Themen