¿Por qué no hay un método getFirst (iterable)?


Iterables presentan dos métodos para getLast

 public static <T> T getLast(Iterable<T> iterable);
 public static <T> T getLast(Iterable<T> iterable, @Nullable T defaultValue);

Pero solo uno para getFirst

 public static <T> T getFirst(Iterable<T> iterable, @Nullable T defaultValue);

¿Hay alguna razón de diseño/implementación para romper la simetría?

Author: sebkur, 2011-12-12

2 answers

Creo que el punto es que no hay razón para un getFirst(iterable) en que esto podría hacerse con iterable.iterator().next(). Guava hace un excelente intento de mantener la API pequeña y por lo tanto no agrega cosas que podrían / deberían hacerse fácilmente de otra manera.

Por otro lado, no hay ya un mecanismo para probar si un iterable está vacío y si es así devolver un valor predeterminado en lugar del primer valor. Por lo tanto, getFirst(iterable, default).

Además, no hay una manera simple de obtener el último elemento, por lo tanto getLast(iterable) y getLast(iterable, default)

 36
Author: John B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-12 15:40:47

Como una adición a la respuesta de @JohnB me gustaría mostrar La opinión de los desarrolladores de Guayaba sobre getFirst(iterable). Kevin Bourrillion (jefe de desarrollo de Guayaba) escribe allí:

Iterable.iterator().next() es perfectamente claro y legible y unambiguous. Sé exactamente lo que hace, mientras que con Iteradores.getFirst(), tengo que correr y buscar cómo esa biblioteca el diseñador decidió hacerlo.

Además, su noción de consistencia está profundamente equivocada. Nosotros usamos coherencia en cómo presentamos funcionalidad importante, pero nunca úsalo para justificar la adición de funcionalidad sin valor, y no deberías en sus propias bibliotecas tampoco!

Así que, tienes una opción:

  • usando iterable.iterator().next(),
  • usando Iterables.getFirst(Iterable<T> iterable, T default),
  • usando Iterables.get(Iterable<T>, 0),
  • escribir su propio método (probablemente conteniendo iterable.iterator().next() y algunos documentos) y utilizarlo como es decir, Iterables2.getFirst(iterable),
  • esperando que Kevin cambie de opinión;)

PD: Tuve dudas similares hace algún tiempo y encontrado duplicado exacto de esta pregunta en ese momento.

 21
Author: Xaerxess,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:46:59