二重配列を使用しているので、Javaストリームを使用して配列をJSONArrayに変換する必要があります。データの損失につながるforEach(共有可変性)を使用してみました。
public static JSONArray arrayToJson(double[] array) throws JSONException{
JSONArray jsonArray = new JSONArray();
Arrays.stream(array)
.forEach(jsonArray::put);
return jsonArray;
}
ストリームを使用してJSONArrayを作成する方法はありますか?
あなたのコードは機能しますが、次のように書くことができます(_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
);
}
_
JSONArray
はスレッドセーフではありません。並列ストリームを使用している場合は、操作を同期する必要があります。
Arrays
.stream(array)
.parallel()
.forEach(e -> {
synchronized(jsonArray) {
jsonArray.put(e);
}
});