¿Hay una manera correcta de recursos cercanos abiertas en java api corriente (para cada elemento)?

user3913960:

¿Hay una manera correcta para abrir un recurso para cada elemento de la colección, de uso API corriente, hacer algo de mapa (), filter (), ojeada () etc., utilizando el recurso y que al cierre del recurso?

Tengo algo como esto:

List<String> names =  getAllNames();
names.stream().map(n -> getElementFromName(n))
              .filter(e -> e.someCondition())
              .peek(e -> e.doSomething())
              .filter(e -> e.otherCondition())
              .peek(e -> e.doSomethingElse())
              .filter(e -> e.lastCondition())
              .forEach(e -> e.doTheLastThing());

Esto debería funcionar bien, excepto que estoy abriendo un recurso (por ejemplo, la conexión db) en el método getElementFromName. Entonces estoy trabajando con ese recurso en los otros métodos de instancia como somecondition o doSomething. Y no tengo idea de cómo cerrar correctamente.

Yo sé, que estoy usando sólo operaciones intermedias en la secuencia. Lo que significa, que todos los métodos son evaluados en la operación forEach y el rendimiento debe ser aceptable debido a la iteración se realiza sólo una vez.

Pero no puedo encontrar la manera de cerrar los recursos abiertos para cada elemento en el método getElementFromName.

Puedo guardar la lista de todos los elementos creados por getElementFromName y cerrar los recursos más adelante. Pero estaría malgastando espacio, manteniendo todos los recursos vivos. También habría segunda iteración a través de la lista de elementos. Lo que hace evitando API corriente preferible en este caso. Entonces, ¿hay alguna manera una forma de auto cerrar el recurso cuando he terminado usando el elemento?

También sé, que se puede hacer fácilmente usando Lopp foreach, estaba ansioso por ver si se puede hacer uso de la API de flujo.

Holger:

Se puede utilizar flatMappara ello:

.flatMap(n -> {
    YourResource r = getElementFromName(n);
    return Stream.of(r).onClose(r::close);
})

Esto supone que el recurso encapsulado por el elemento devuelto tiene el close()método. Si no es así, el código se vuelve más complicado, pero la imagen debe ser clara. En lugar de devolver un solo objeto, usted está volviendo una corriente de un solo elemento cuya onCloseacción hace la limpieza necesaria. Si se puede lanzar excepciones controladas, también tendrá que agregar un controlador para que, preferentemente, envolviendo la excepción de una excepción no comprobada.

Esto se basa en la garantía hecha por flatMap:

Cada corriente asignada es closeddespués de que sus contenidos se han colocado en esta corriente.

Pero, en general, este código, especialmente el uso excesivo de peek , parece altamente sospechoso.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=180543&siteId=1
Recomendado
Clasificación