web-dev-qa-db-fra.com

Pourquoi n'y a-t-il pas de méthode getFirst (itérable)?

Iterables présente deux méthodes pour getLast

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

mais un seul pour getFirst

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

Y a-t-il une raison de conception/mise en œuvre pour rompre la symétrie?

36
Stan Kurilin

Je pense que le fait est qu'il n'y a aucune raison pour une getFirst(iterable) en ce que cela pourrait être fait avec iterable.iterator().next(). La goyave fait une excellente tentative pour garder l'API petite et n'ajoute donc pas de choses qui pourraient/devraient être faites facilement d'une autre manière.

En revanche, il n'y a pas déjà de mécanisme pour tester si un itérable est vide et si c'est le cas retourner une valeur par défaut au lieu de la première valeur. Par conséquent, getFirst(iterable, default).

De plus, il n'y a pas de moyen simple pour obtenir le dernier élément, donc getLast(iterable) et getLast(iterable, default)

38
John B

Comme ajout à la réponse de @ JohnB, je voudrais montrer L'opinion des développeurs de Guava sur getFirst(iterable) . Kevin Bourrillion (responsable du développement de Guava) y écrit:

iterable.iterator (). next () est parfaitement clair et lisible et sans ambiguïté . Je sais exactement ce qu'il fait, alors qu'avec Iterators.getFirst (), je dois m'enfuir et chercher comment ce concepteur de bibliothèque a décidé de le faire.

De plus, votre notion de cohérence est profondément erronée. Nous utilisons la cohérence dans la façon dont nous présentons les fonctionnalités importantes, mais nous ne l'utilisons jamais pour justifier l'ajout de fonctionnalités sans valeur, et vous ne devriez pas non plus le faire dans vos propres bibliothèques!

Donc tu as un choix:

  • en utilisant iterable.iterator().next(),
  • en utilisant Iterables.getFirst(Iterable<T> iterable, T default),
  • en utilisant Iterables.get(Iterable<T>, 0),
  • écrire votre propre méthode (contenant probablement iterable.iterator().next() et quelques documents) et l'utiliser comme c'est-à-dire Iterables2.getFirst(iterable),
  • attendant que Kevin change d'avis;)

PS: J'avais un doute similaire il y a quelque temps et j'ai trouvé copie exacte de cette question à ce moment-là.

22
Xaerxess