Java 8 chemin du travail avec un enum

Je me demandais quelle est la meilleure façon est de Java 8 de travailler avec toutes les valeurs d'une énumération. En particulier lorsque vous avez besoin pour obtenir toutes les valeurs et l'ajouter à quelque part, par exemple, en supposant que nous en avons l'enum ci-dessous:

public enum Letter {
 A, B, C, D;
}

Je pourrais bien sûr faire ce qui suit:

for (Letter l : Letter.values()) {
    foo(l);
}

Mais, je pourrais aussi ajouter la méthode suivante pour l'enum définition:

public static Stream<Letter> stream() {
    return Arrays.stream(Letter.values());
}

Et puis remplacez le pour de ci-dessus avec:

Letter.stream().forEach(l -> foo(l));

Cette approche est OK ou faut-il une faute dans la conception ou la performance? En outre, pourquoi ne pas les enums un stream() la méthode?

  • Pourquoi ne pas ajouter une méthode static void forEach(Consumer<Letter> action) à votre enum? Ensuite, vous pouvez simplement appeler avec Letter.forEach(l -> foo(l)).
  • Cela semble exagéré pour moi. Comme les tableaux ne prennent pas en charge le flux de l'API, je voudrais juste utiliser une boucle for et faire. Il semble que vous soyez en ajoutant de la complexité juste pour être nouveaux et brillant, mais il n'est pas de gagner quoi que ce soit ici.
  • Cela ressemble à de l'optimisation prématurée. Je ne recommande pas de faire une référence pour votre scénario spécifique et de la technologie de la pile en utilisant JMH ou l'Étrier et d'utiliser la meilleure approche.
  • De la première à obtenir ce travail, puis aller pour les optimisations de performances, et non pas l'inverse.
  • c'est l'une des choses que je pensais, si dans un effort pour rendre le code le plus java8 façon je n'étais pas "tuer une mouche avec un bazooka". Mais en revanche, le code avec le flux de la méthode est mieux 😉
  • En aparté, forEach(l -> foo(l)) peut-être mieux écrit que forEach(foo).
  • C#, les gens se déplacent difficilement lorsque vous faites cela - pourquoi.
  • Noter que l'appel Enum.values retourne un Enum[]. Comme un tableau est mutable l' enum doit de retour d'une autre copie de la matrice à chaque fois (juste au cas où quelqu'un muté il), ce qui signifie que tout appel à Enum.values doit être O(n). C'est une faille dans la conception de enum - immuable Set aurait été un bien meilleur choix, mais cela signifie que si le rendement est primordial, alors vous devriez cache Enum.value dans une immuable Set et qui offre un stream() méthode...
  • l'Araignée: ou tout simplement utiliser EnumSet.allOf(Letter.class).stream() qui va utiliser un tableau partagé sous le capot. Ou comme cette réponse les points, même n'a pas besoin d'un Stream lorsque toutes les OP veut, c'est forEach(…).
  • est-ce exact? Regarder les code source la EnumSet appelle une abstract addAll de la méthode étant donné que EnumSet aussi mutable - ne serait-ce pas aussi être O(n)?
  • l'Araignée: Non, ce n'est pas la norme Collection de addAll méthode, c'est un spécial enum méthode spécifique. Il ne touche même pas un tableau.
  • J'ai écrit un rapide jmh référence pour essayer de mettre quelques chiffres pour tout cela. Étonnamment, il semble que Enum.values() est sensiblement plus rapide que les autres approches. Je suis peut-être abuser de JMH en quelque sorte...

InformationsquelleAutor Rumal | 2015-04-28