java collections guava api-design iterable

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



collections guava (2)

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 algún motivo de diseño / implementación para romper la simetría?


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

iterable.iterator (). next () es perfectamente claro y legible y no ambiguo . Sé exactamente lo que hace, mientras que con Iterators.getFirst (), tengo que salir corriendo y buscar cómo el diseñador de la biblioteca decidió hacerlo.

Además, su noción de consistencia está profundamente equivocada. Usamos coherencia en la forma en que presentamos funciones importantes, pero nunca lo usamos para justificar la adición de funcionalidades sin valor, ¡y tampoco debería hacerlo en sus propias bibliotecas!

Entonces, tienes una opción:

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

PD: tuve dudas similares hace algún tiempo y encontré un duplicado exacto de esta pregunta en ese momento.


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

Por otro lado, todavía no existe 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 getLast(iterable) tanto getLast(iterable) y getLast(iterable, default)