Categorías
Others

Devolver una transmisión frente a devolver una colección

Muchas clases de API de Java tienen métodos que devuelven una colección. Desde Java 8, los métodos también pueden devolver un Stream. Dado que Stream es más flexible y eficiente en muchos casos, ¿deberíamos devolver Steam o Collection para nuestros métodos API?

Un ejemplo motivacional

Para devolver una colección, los elementos de la colección se crean primero y luego se guardan en la memoria. Entonces, hay dos costos: cálculo y asignación de memoria.

Considere los siguientes dos métodos de la java.nio.file.Files clase:

static List<String>    readAllLines(Path path)
static Stream<String>  lines(Path path)

Para devolver una lista de cadenas, el readAllLines() El método tiene que leer hasta el final del archivo primero y luego almacenar todo el contenido del archivo en la memoria para obtener el resultado. En contraste, el lines() El método puede devolver líneas inmediatamente después de comenzar a leer el archivo. El costo se reduce en gran medida al aprovechar el comportamiento de búsqueda de pereza de Stream. Por ejemplo, si un método de llamada solo necesita buscar algo una vez, el programa ni siquiera necesita leer hasta el final del archivo.

boolean result = Files.lines(path).anyMatch(x -> x.charAt(0) == 'z');

¿Por qué debería preferirse Stream en muchos casos?

Las razones por las que Stream debería ser preferido en muchos casos (no en todos) radica en el comportamiento de Stream. Se resumen a continuación:

  1. Si el resultado puede ser infinito, se debe utilizar Stream.
  2. Si el resultado puede ser muy grande, probablemente prefiera Stream, ya que materializar la colección tiene un requisito de montón significativo.
  3. Si la persona que llama solo itera a través de él (buscar, filtrar, agregar), debería preferir Stream, ya que Stream ya los tiene incorporados y no hay necesidad de materializar una colección (especialmente si el usuario no puede procesar el resultado completo). es un caso muy común.
  4. Es posible que la colección que elija para guardar los resultados no sea la forma que desea la persona que llama, entonces la persona que llama tiene que copiarla de todos modos. Si se devuelve una transmisión, la persona que llama puede hacer collect(toCollection(factory)) y consiguen lo que quieren.
  Obtenga la hora actual utilizando java.util.Calendar # getInstance ()

El único caso en el que debe devolver una colección es cuando existen fuertes requisitos de coherencia y debe producir una instantánea coherente de un objetivo en movimiento. Luego, querrá poner los elementos en una colección que no cambiará.

En resumen, Stream es la opción correcta en la mayoría de los casos, no impone costos de materialización generalmente innecesarios y se puede convertir fácilmente en la Colección de su elección si es necesario. Pero a veces, es posible que deba devolver una Colección (por ejemplo, debido a fuertes requisitos de coherencia), o puede que desee devolver la Colección porque sabe cómo la usará el usuario y sabe que esto es lo más conveniente para ellos.

Esta pregunta fue publicada originalmente por FredOverflow en Desbordamiento de pila. Esta publicación se reorganiza en función de las dos respuestas populares proporcionadas por Brian Goetz y Stuart Marks. Esta publicación está bajo licencia CC-BY-SA.

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

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