Java 8 parallelStream para la llamada simultánea de base de datos / REST

Aquí estoy usando Javaparallel stream para iterar a través de una Lista y llamar a una llamada REST con cada elemento de la lista como entrada. Necesito agregar todos los resultados de la llamada REST a una colección para la que estoy usando un ArrayList. El código que se proporciona a continuación funciona bien, excepto que la no seguridad de subprocesos de ArrayList causaría resultados incorrectos, y la adición de la sincronización necesaria causaría contención, socavando el beneficio del paralelismo.

¿Puede alguien sugerirme una forma adecuada de utilizar la transmisión paralela para mi caso?

public void myMethod() {
    List<List<String>> partitions = getInputData();
    final List<String> allResult = new ArrayList<String>();
    partitions.parallelStream().forEach(serverList -> callRestAPI(serverList, allResult);
}

private void callRestAPI(List<String> serverList, List<String> allResult) {
    List<String> result = //Do a REST call.
    allResult.addAll(result);
}
Respuesta 1

Puede realizar la operación en maplugar de forEach: eso garantizará la seguridad del hilo (y es más limpio desde una perspectiva de programación funcional):

List<String> allResult = partitions.parallelStream()
          .map(this::callRestAPI)
          .flatMap(List::stream) //flattens the lists
          .collect(toList());

Y tu callRestAPImétodo:

private List<String> callRestAPI(List<String> serverList) {
    List<String> result = //Do a REST call.
    return result;
}
Respuesta: 2

Cómo cerrar el applet desde el código He usado System.exit (0) pero solo arroja un montón de excepciones y no lo cerró. Entiendo que es responsabilidad del usuario cerrar el applet, pero aún así ...

¿Es posible establecer el valor dentro del archivo de propiedades en tiempo de ejecución? Intenté esto y cambia mientras leía la propiedad, pero cuando reviso el archivo, los cambios no se reflejan. tratar { ...

Mientras leía la especificación JVM (como uno lo hace), me sorprendió mucho cuando me encontré con los 7 códigos de operación iconst_ <i>. Después de todo, solo hay un byte para jugar. Raramente escribo el ...

Estoy tratando de entender los sombreadores que usan libgdx, provenientes de un fondo XNA / HLSL. Estoy tratando de obtener un par de sombreadores vert / frag para reproducir la salida que obtengo sin un sombreador, pero no se muestra ...