2017-02-21 4 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); 
    ... 
} 

それは私がやってみたかったただ一つの操作した場合は、JSON配列を返すようにするために、私はここで

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

ようこそスタックオーバーフロー!このユーザーの問題を解決しているかもしれませんが、将来この問題に遭遇するユーザーにとってはコードオンリーの回答はあまり役に立ちません。あなたのコードが元の問題を解決する理由を説明するために、あなたの答えを編集してください。 –

+1

コードをフォーマットしてください。 –

1

を行うことができ作業コードです。

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

ここに記載されている解決策は機能していますが、ストリームコンテキスト外のオブジェクトを変更しているため、避けるべきです。

を使用する代わりに、終了操作であるvoidを返します。正しいアプローチは、.map()を使用することです。名前のように、1つの値を別の値にマップします。あなたの場合、最初に行う操作はPersonをJSONObjectにマッピングすることです。 2番目の操作は、すべてのJSONObjectを1つの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実装では、残念ながら2つの配列を簡単にマージする方法はありません。だから、私はJSONArrayを減らす代わりに、まずすべてのJSONObjectをListとして収集し、そこから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; 
} 
関連する問題