Dlaczego ta metoda wartości () nie jest wymieniony tutaj pod java.lang.enum
jacktrades
80
@jacktrades: Jest to metoda niejawna, która istnieje tylko w kompilatorze. Dlatego klasa podstawowa nie może zadeklarować metody o tej samej nazwie, a zatem nie zostanie uwzględniona w automatycznie generowanym Javadocs. docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.2
Torben
4
Dziwnie, jest to wspomniane w dokumentach valueOf ()
greg7gkb
129
Wszystkie stałe typu wyliczeniowego można uzyskać, wywołując public static T[] values()metodę niejawną tego typu:
for(Direction d :Direction.values()){System.out.println(d);}
Super przydatne dla pętli foreach Java8. EnumSet.allOf (Enum.class) .forEach (bla -> method (bla))
Hiro2k
1
@ Hiro2k Można również zrobić Arrays.stream(Enum.values()).forEach(...)- strumień będzie sekwencyjny
RAnders00
1
@ schatten dobrze, to setzamiast array. Nie jest to „lepsze”, chociaż moim zdaniem lepiej opisuje wartości wyliczeniowe, ponieważ z definicji zbioru wartości w zestawie nie mogą się powtarzać (jak w wyliczeniu), podczas gdy wartości w tablicy mogą być.
Jezor
2
@Jezor Jest to lepszy wybór, gdy naprawdę potrzebujesz bardzo szybkiego zestawu wyliczeń, takich jak flagi bitów, choć wydaje się to zbyt skomplikowane, aby można je było po prostu powtórzyć.
schatten
44
Strumienie
Przed Javą 8
for(Direction dir :Direction.values()){System.out.println(dir);}
Java 8
Możemy również korzystać z lambda i strumieni ( samouczek ):
Dlaczego forEachOrderedi nie forEachze strumieniami?
Zachowanie forEachjest wyraźnie niedeterministyczne, gdy jako forEachOrderedwykonuje akcję dla każdego elementu tego strumienia, w kolejności spotkań strumienia, jeśli strumień ma zdefiniowaną kolejność spotkań. Tak forEachnie gwarantuje, że zamówienie zostanie utrzymane.
Również podczas pracy ze strumieniami (szczególnie równoległymi) należy pamiętać o naturze strumieni. Zgodnie z dokumentem :
Wyniki potoku strumienia mogą być niedeterministyczne lub niepoprawne, jeśli parametry behawioralne operacji strumienia są stanowe. Stanowa lambda to taka, której wynik zależy od dowolnego stanu, który może się zmienić podczas wykonywania potoku strumienia.
Set<Integer> seen =Collections.synchronizedSet(newHashSet<>());
stream.parallel().map(e ->{if(seen.add(e))return0;elsereturn e;})...
Tutaj, jeśli operacja mapowania jest wykonywana równolegle, wyniki dla tego samego wejścia mogą się różnić w zależności od przebiegu, ze względu na różnice w szeregowaniu wątków, podczas gdy przy bezstanowym wyrażeniu lambda wyniki zawsze będą takie same.
Skutki uboczne parametrów behawioralnych podczas operacji strumieniowych są na ogół odradzane, ponieważ często mogą prowadzić do nieświadomego naruszenia wymogu bezpaństwowości, a także innych zagrożeń bezpieczeństwa wątków.
Strumienie mogą mieć określoną kolejność spotkań lub nie. To, czy strumień ma kolejność spotkań, zależy od operacji źródłowej i pośredniej.
Podobnie jak w przypadku wszystkich operacji przesyłania strumieniowego należy pamiętać o bezpaństwowości wątków i ograniczeniach skutków ubocznych docs.oracle.com/javase/8/docs/api/java/util/stream/… . Te dwie opcje iteracji wyliczeniowej różnią się znacznie pod tym względem.
Pod warunkiem, że importujesz java.util.EnumSet i java.util.Set
Nate
4
Z dokumentacji dlaEnumSet : Iterator zwrócony metodą iteratora przemierza elementy w ich naturalnym porządku (kolejność, w której deklarowane są stałe wyliczeniowe) . Gwarantuje to, że kolejność iteracji odpowiada kolejności zwróconej przez Enum.values().
Jeff G
18
for(Direction d :Direction.values()){//your code here }
Odpowiedzi:
.values()
Możesz wywołać
values()
metodę na swoim wyliczeniu.Ta
values()
metoda jest domyślnie zadeklarowana przez kompilator . Więc nie ma go wEnum
dokumencie.źródło
Wszystkie stałe typu wyliczeniowego można uzyskać, wywołując
public static T[] values()
metodę niejawną tego typu:źródło
#
zrobić?Enum#values()
=Enum.values()
.
(zawsze?)?Możesz to zrobić w następujący sposób:
źródło
Arrays.stream(Enum.values()).forEach(...)
- strumień będzie sekwencyjnyset
zamiastarray
. Nie jest to „lepsze”, chociaż moim zdaniem lepiej opisuje wartości wyliczeniowe, ponieważ z definicji zbioru wartości w zestawie nie mogą się powtarzać (jak w wyliczeniu), podczas gdy wartości w tablicy mogą być.Strumienie
Przed Javą 8
Java 8
Możemy również korzystać z lambda i strumieni ( samouczek ):
Dlaczego
forEachOrdered
i nieforEach
ze strumieniami?Zachowanie
forEach
jest wyraźnie niedeterministyczne, gdy jakoforEachOrdered
wykonuje akcję dla każdego elementu tego strumienia, w kolejności spotkań strumienia, jeśli strumień ma zdefiniowaną kolejność spotkań. TakforEach
nie gwarantuje, że zamówienie zostanie utrzymane.Również podczas pracy ze strumieniami (szczególnie równoległymi) należy pamiętać o naturze strumieni. Zgodnie z dokumentem :
Wyniki potoku strumienia mogą być niedeterministyczne lub niepoprawne, jeśli parametry behawioralne operacji strumienia są stanowe. Stanowa lambda to taka, której wynik zależy od dowolnego stanu, który może się zmienić podczas wykonywania potoku strumienia.
Tutaj, jeśli operacja mapowania jest wykonywana równolegle, wyniki dla tego samego wejścia mogą się różnić w zależności od przebiegu, ze względu na różnice w szeregowaniu wątków, podczas gdy przy bezstanowym wyrażeniu lambda wyniki zawsze będą takie same.
Skutki uboczne parametrów behawioralnych podczas operacji strumieniowych są na ogół odradzane, ponieważ często mogą prowadzić do nieświadomego naruszenia wymogu bezpaństwowości, a także innych zagrożeń bezpieczeństwa wątków.
Strumienie mogą mieć określoną kolejność spotkań lub nie. To, czy strumień ma kolejność spotkań, zależy od operacji źródłowej i pośredniej.
źródło
źródło
Jeśli nie zależy ci na zamówieniu, powinno to działać:
źródło
EnumSet
: Iterator zwrócony metodą iteratora przemierza elementy w ich naturalnym porządku (kolejność, w której deklarowane są stałe wyliczeniowe) . Gwarantuje to, że kolejność iteracji odpowiada kolejności zwróconej przezEnum.values()
.źródło
Java8
z Java5 +
źródło
Spróbuj użyć dla każdego
źródło
Więcej metod w java 8:
Korzystanie
EnumSet
zforEach
Korzystanie
Arrays.asList
zforEach
źródło