Saltar al contenido

Cómo convertir una colección/ array en JSONArray usando stream en Java 8

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *