Este dilema se puede abordar de diversas formas, sin embargo te mostramos la que para nosotros es la resolución más completa.
Solución:
Tu código funciona, pero puedes escribir algo como esto (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
));
un ejemplo más (crear un String
desde List
):
List list = ...
String str = list.stream()
.collect(Collector.of(
StringBuilder::new,
StringBuilder::append,
StringBuilder::append,
StringBuilder::toString //last action of the accumulator (optional)
));
Se ve bien, pero las quejas del compilador:
error: incompatible thrown types JSONException in method reference .collect(Collector.of(JSONArray::new, JSONArray::put, JSONArray::put)
Revisé esto en jdk 13.0.1
y JSON 20190722
y no encontré problemas excepto de Expected 3 arguments, but found 1
en .collect(...)
.
(gradle : implementation group: 'org.json', name: 'json', version: '20190722'
)
Arreglar:
public static JSONArray arrayToJson(double[] array) throws JSONException
return Arrays.stream(array).collect(
JSONArray::new,
JSONArray::put,
(ja1, ja2) ->
for (final Object o : ja2)
ja1.put(o);
);
Nota: El combinador no puede ser una referencia de método solo JSONArray::put
porque esto solo pondrá uno array en el otro (por ejemplo [[]]
) en lugar de combinarlos como es el comportamiento deseado.
JSONArray
no es seguro para subprocesos. Si está utilizando flujo paralelo, debe sincronizar la operación.
Arrays
.stream(array)
.parallel()
.forEach(e ->
synchronized(jsonArray)
jsonArray.put(e);
);
Agradecemos que desees proteger nuestro cometido escribiendo un comentario y puntuándolo te lo agradecemos.