web-dev-qa-db-ja.com

Java 8のストリームを使用してコレクション/配列をJSONArrayに変換する方法

二重配列を使用しているので、Javaストリームを使用して配列をJSONArrayに変換する必要があります。データの損失につながるforEach(共有可変性)を使用してみました。

public static JSONArray arrayToJson(double[] array) throws JSONException{
    JSONArray jsonArray = new JSONArray();

    Arrays.stream(array)
         .forEach(jsonArray::put);  

    return jsonArray;
}

ストリームを使用してJSONArrayを作成する方法はありますか?

7
Mostwanted Mani

あなたのコードは機能しますが、次のように書くことができます(_jdk 8_):

_return Arrays.stream(array)
            .collect(Collector.of(
                          JSONArray::new, //init accumulator
                          JSONArray::put, //processing each element
                          JSONArray::put  //confluence 2 accumulators in parallel execution
                     ));
_

もう1つの例(_List<String>_からStringを作成)

_List<String> list = ...
String str = this.list
                 .stream()
                 .collect(Collector.of(
                    StringBuilder::new,
                    (b ,s) -> b.append(s),
                    (b1, b2) -> b1.append(b2),
                    StringBuilder::toString   //last action of the accumulator (optional)  
                 ));
_

見た目は良いですが、コンパイラの不満:エラー:メソッド参照で互換性のないスローされた型JSONException .collect(Collector.of(JSONArray :: new、JSONArray :: put、JSONArray :: put)

_jdk 13.0.1_と_JSON 20190722_(Gradle:_compile group: 'org.json', name: 'json', version: '20190722'_)でこれを確認しました

.collect(...)の_Expected 3 arguments but found 1_以外は問題は見つかりませんでした。 修正

_public static JSONArray arrayToJson(double[] array) throws JSONException {
    return Arrays.stream(array).collect(
            JSONArray::new,
            JSONArray::put,
            JSONArray::put
    );
}
_
12
kozmo

JSONArrayはスレッドセーフではありません。並列ストリームを使用している場合は、操作を同期する必要があります。

Arrays
    .stream(array)
    .parallel()
    .forEach(e -> {
        synchronized(jsonArray) {
            jsonArray.put(e);
        }
    });
3
zhh