Java'da bir numaralandırma üzerinde yineleme yapmak için bir 'for' döngüsü


Yanıtlar:


1400

.values()

values()Yöntemi numaralandırmanızda çağırabilirsiniz .

for (Direction dir : Direction.values()) {
  // do what you want
}

Bu values()yöntem derleyici tarafından örtülü olarak bildirilir . Yani Enumdoc'de listelenmiyor .


43
Neden bu yöntem değerleri () burada java.lang.enum altında listelenmiyor
jacktrades

80
@jacktrades: Yalnızca derleyicide bulunan örtük bir yöntemdir. Bu nedenle temel sınıf, aynı ada sahip bir yöntem bildiremez ve bu nedenle otomatik olarak oluşturulan Javadoc'lara dahil edilmez. docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.2
Torben

4
İşin garibi, bu (o) (docs)
değerinde

129

Bir numaralandırma türünün tüm sabitleri public static T[] values(), o türün örtük yöntemi çağrılarak elde edilebilir :

 for (Direction d : Direction.values()) {
     System.out.println(d);
 }

@ RAnders00 Doğru. Ama yine de cevap geçerli ve format gerçekten önemli değil (benim için en az)
dARKpRINCE

Ne yapar #?
YoTengoUnLCD

@YoTengoUnLCD Temelde değerleri () Enum nesnesinin bir parçası olduğunu söylüyor. eg Enum#values()=Enum.values()
Spotlight

Hmm, özür dilerim, takip etmiyorum, .(her zaman?) Kullanmakla aynı mı?
YoTengoUnLCD

3
@YoTengoUnLCD Hashtag Java kodu değil JavaDoc sözdizimidir.
Jeff G

62

Bunu aşağıdaki gibi yapabilirsiniz:

for (Direction direction : EnumSet.allOf(Direction.class)) {
  // do stuff
}

1
Java.util.EnumSet
Nate

8
Java8 foreach döngüleri için süper yararlıdır. EnumSet.allOf (Enum.class). ForEach (blah -> yöntem (blah))
Hiro2k

1
@ Hiro2k Ayrıca yapabilirsin Arrays.stream(Enum.values()).forEach(...)- akış sıralı olacak
RAnders00

1
@schatten, bunun setyerine array. Bence enum değerlerini daha iyi açıklasa da "daha iyi" değildir, çünkü setin tanımından setteki değerler tekrarlanamaz (enum'da olduğu gibi), dizideki değerler olabilir.
Jezor

2
@Jezor Basit bir yineleme için çok karmaşık gibi görünse de, bit bayrakları gibi çok hızlı bir dizi numaraya ihtiyacınız olduğunda daha iyi bir seçimdir.
Schatten

44

Canlı Yayınlar

Java 8'den önce

for (Direction dir : Direction.values()) {
            System.out.println(dir);
}

Java 8

Ayrıca lambda ve akarsudan da faydalanabiliriz ( Eğitim ):

Stream.of(Direction.values()).forEachOrdered(System.out::println);

Neden forEachOrderedve forEachakarsu ile değil ?

Öğesinin davranışı forEachaçıkça belirsizdir; burada forEachOrderedakış, tanımlı bir karşılaşma sırasına sahipse akışın karşılaşma sırasında bu akışın her öğesi için bir eylem gerçekleştirir. Bu yüzden forEachsiparişin korunacağını garanti etmez.

Ayrıca akışlarla (özellikle paralel olanlar) çalışırken, akışların doğasını unutmayın. Gereğince doc :

Akış işlemlerine ilişkin davranışsal parametreler durumluysa akış boru hattı sonuçları belirsiz veya yanlış olabilir. Durum bilgisi olan bir lambda, sonucu akış boru hattının yürütülmesi sırasında değişebilecek herhangi bir duruma bağlı olan bir lambdadır.

Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...

Burada, eşleme işlemi paralel olarak gerçekleştirilirse, aynı girdi için sonuçlar iplik zamanlama farklılıkları nedeniyle çalışmadan çalışmaya değişebilir, oysa durumsuz bir lambda ifadesi ile sonuçlar her zaman aynı olur.

Akış işlemlerine yönelik davranışsal parametrelerdeki yan etkiler, genellikle vatansızlık gereksiniminin yanı sıra diğer iplik güvenliği tehlikelerinin farkında olmadan ihlal edilmesine yol açabileceğinden, genellikle önerilmez.

Akışlar tanımlı bir karşılaşma sırasına sahip olabilir veya olmayabilir. Bir akışın karşılaşma sırasına sahip olup olmadığı kaynağa ve ara işlemlere bağlıdır.


Tüm akış işlemlerinde olduğu gibi, iplik vatansızlığının ve yan etki sınırlarının farkında olun docs.oracle.com/javase/8/docs/api/java/util/stream/… . Bu 2 numaralandırma yineleme seçeneği bu açıdan önemli ölçüde farklıdır.
buzz3791


19

Siparişi umursamıyorsanız, bu işe yaramalıdır:

Set<Direction> directions = EnumSet.allOf(Direction.class);
for(Direction direction : directions) {
    // do stuff
}

2
Java.util.EnumSet ve java.util.Set'i içe aktarmanız şartıyla
Nate

4
Aşağıdakiler için belgelerdenEnumSet : Yineleyici yöntemi tarafından döndürülen yineleyici, öğeleri doğal düzeninde (enum sabitlerinin bildirildiği sıra) geçirir . Bu, yineleme sırasının, döndürülen siparişle eşleştiğini garanti eder Enum.values().
Jeff G

18
    for (Direction  d : Direction.values()) {
       //your code here   
    }

5

Java8

Stream.of(Direction.values()).forEach(System.out::println);

Java5 + 'dan

for ( Direction d: Direction.values()){
 System.out.println(d);
}

1
ay pardon. Ben akhil_mittal zaten benzer bir cevap gönderdi fark ettim.
Raghu K Nair

Stream.of (o) .forEach'ı ne zaman ve neden kullanmalıyım? For döngüsü çok daha okunaklı görünüyor.
Jeremy

Fonksiyonel programlamaya aşina iseniz değil.
Alexis Dufrenoy

5

Her biri için bir

for ( Direction direction : Direction.values()){
  System.out.println(direction.toString());
}

4

Java 8'de daha fazla yöntem:

Kullanımı EnumSetileforEach

EnumSet.allOf(Direction.class).forEach(...);

Kullanımı Arrays.asListileforEach

Arrays.asList(Direction.values()).forEach(...);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.