ජාවා හි එනූමයක් හරහා නැවත යෙදීම සඳහා 'සඳහා' ලූපයක්


879

මට අ enumකාර්දිනල් සහ අතරමැදි දිශාවන් සඳහා ජාවා හි ඇත:

public enum Direction {
   NORTH,
   NORTHEAST,
   EAST,
   SOUTHEAST,
   SOUTH,
   SOUTHWEST,
   WEST,
   NORTHWEST
}

forමෙම එක් එක් enumඅගයන් හරහා පුනරාවර්තනය වන ලූපයක් ලිවිය හැක්කේ කෙසේද ?


Answers:


1410

.values()

ඔබට values()ඔබේ එනුම් මත ක්‍රමය අමතන්න .

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

මෙම values()ක්‍රමය සම්පාදකයා විසින් ව්‍යංගයෙන් ප්‍රකාශ කරනු ලැබේ . එබැවින් එය ලේඛනයේ ලැයිස්තුගත කර නොමැත Enum.


43
මෙම ක්‍රමයේ අගයන් () මෙහි java.lang.enum යටතේ ලැයිස්තුගත නොවන්නේ ඇයි
jacktrades

80
ackjacktrades: එය සම්පාදකයා තුළ පමණක් පවතින ව්‍යංග ක්‍රමයකි. එබැවින් මූලික පන්තියට එකම නමක් සහිත ක්‍රමයක් ප්‍රකාශ කළ නොහැකි අතර එමඟින් ස්වයංක්‍රීයව ජනනය කරන ලද ජාවඩොක්ස් වලට එය ඇතුළත් නොවේ. docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.2
Torben

4
නියමාකාරයෙන් එය ඕෆ් () ලියකියවිලි
greg7gkb

129

එනුම් වර්ගයක සියලුම නියතයන් public static T[] values()එම වර්ගයේ ව්‍යංග ක්‍රමය ඇමතීමෙන් ලබා ගත හැකිය :

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

Ners RAnders00 ඇත්ත. නමුත් තවමත් පිළිතුර වලංගු වන අතර ආකෘතිය ඇත්ත වශයෙන්ම වැදගත් නොවේ (මට අවම වශයෙන්)
dARKpRINCE

මොකක්ද මේ කරන්නේ #ද?
YoTengoUnLCD

@YoTengoUnLCD මූලික වශයෙන් කියනුයේ අගයන් () එනුම් වස්තුවේ කොටසක් බවයි. උදා Enum#values()=Enum.values()
ස්පොට් ලයිට්

හ්ම්, මට කණගාටුයි, මම අනුගමනය නොකරමි, එය .(සැමවිටම?) භාවිතා කිරීම හා සමානද?
YoTengoUnLCD

3
@YoTengoUnLCD හැෂ් ටැගය ජාවා කේතය නොව ජාවාඩොක් සින්ටැක්ස් වේ.
ජෙෆ් ජී

63

ඔබට මෙය පහත පරිදි කළ හැකිය:

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

1
ඔබට ආනයනය කර ඇත්තේ java.util.EnumSet
Nate

8
Java8 foreach loops සඳහා සුපිරි ප්‍රයෝජනවත්. EnumSet.allOf (Enum.class) .forEach (blah -> method (
blah

1
@ Hiro2k ඔබටත් කළ හැකිය Arrays.stream(Enum.values()).forEach(...)- ධාරාව අනුක්‍රමික වනු ඇත
RAnders00

1
හොඳයි, ඒ setවෙනුවට array. එය "වඩා හොඳ" නොවේ, එය මගේ මතය අනුව වඩා හොඳ අගයන් විස්තර කළද, සෙට් අර්ථ දැක්වීම අනුව, කට්ටලයේ අගයන් පුනරාවර්තනය කළ නොහැක (එනුම් මෙන්), නමුත් අරාවෙහි අගයන් විය හැකිය.
ජෙසෝර්

2
Es ජෙසෝර් සරල පුනරාවර්තනයක් සඳහා ඉතා සංකීර්ණ බවක් පෙනෙන්නට තිබුණත්, බිට් කොඩි වැනි ඉතා වේගවත් එනූම් කට්ටලයක් ඔබට අවශ්‍ය විට එය වඩා හොඳ තේරීමකි.
විසුරුවා හරින්න

44

ධාරාවන්

ජාවා 8 ට පෙර

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

ජාවා 8

අපට ලැම්බඩා සහ ඇළ දොළ භාවිතා කළ හැකිය ( නිබන්ධනය ):

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

ඇයි forEachOrderedනොව forEachඇළ?

මෙම ප්‍රවාහයේ එක් එක් මූලද්‍රව්‍යයන් සඳහා ක්‍රියාවක් සිදු කරන විට, ප්‍රවාහයේ අර්ථකථන ගැටුම් අනුපිළිවෙලක් තිබේ නම්, ධාරාවේ ගැටුම් අනුපිළිවෙලෙහි හැසිරීම forEachපැහැදිලිවම forEachOrderedනිර්වචනය නොවේ. එබැවින් forEachඇණවුම තබා ඇති බවට සහතික නොවේ.

ධාරාවන් සමඟ වැඩ කිරීමේදී (විශේෂයෙන් සමාන්තර ඒවා) ධාරාවන්හි ස්වභාවය මතක තබා ගන්න. දක්වා ඇති පරිදි ලේඛය :

ධාරා මෙහෙයුම් සඳහා චර්යාත්මක පරාමිතීන් රාජ්‍ය නම්, ප්‍රවාහ නල මාර්ග ප්‍රති results ල නිර්විනාශක හෝ වැරදි විය හැකිය. ස්ථායී ලැම්බඩා යනු ප්‍රවාහ නල මාර්ගය ක්‍රියාත්මක කිරීමේදී වෙනස් විය හැකි ඕනෑම තත්වයක් මත රඳා පවතින ප්‍රති result ලයකි.

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

මෙහිදී, සිතියම්ගත කිරීමේ ක්‍රියාවලිය සමාන්තරව සිදු කරන්නේ නම්, නූල් උපලේඛනගත වෙනස්කම් හේතුවෙන් එකම ආදානයේ ප්‍රති results ල ධාවනය සිට ධාවනය දක්වා වෙනස් විය හැකි අතර, අස්ථායි ලැම්බඩා ප්‍රකාශනයකින් ප්‍රති always ල සැමවිටම සමාන වේ.

ප්‍රවාහ ක්‍රියාකාරකම් සඳහා චර්යාත්මක පරාමිතීන්හි අතුරු ආබාධ සාමාන්‍යයෙන් අධෛර්යමත් වේ, මන්දයත් ඒවා බොහෝ විට නොදැනුවත්වම අස්ථායි අවශ්‍යතාව උල්ලං lations නය කිරීම්වලට මෙන්ම වෙනත් නූල්-ආරක්ෂක උපද්‍රවයන්ට ද හේතු විය හැකි බැවිනි.

ප්‍රවාහයන්ට අර්ථ දැක්වීමේ හමුවීමේ අනුපිළිවෙලක් තිබිය හැකිය හෝ නොතිබිය හැකිය. ප්‍රවාහයකට ගැටුම් අනුපිළිවෙලක් තිබේද නැද්ද යන්න රඳා පවතින්නේ ප්‍රභවය සහ අතරමැදි මෙහෙයුම් මත ය.


සියළුම ධාරා මෙහෙයුම් වලදී මෙන්ම නූල් අස්ථායිතාව සහ අතුරු ආබාධ සීමාවන් පිළිබඳව දැනුවත් වන්න docs.oracle.com/javase/8/docs/api/java/util/stream/… . මේ සම්බන්ධයෙන් මෙම enum iteration විකල්ප 2 සැලකිය යුතු ලෙස වෙනස් වේ.
buzz3791


19

ඔබ ඇණවුම ගැන තැකීමක් නොකරන්නේ නම් මෙය ක්‍රියාත්මක විය යුතුය:

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

2
ඔබට java.util.EnumSet සහ java.util.Set
Nate

4
සඳහා වන ප්‍රලේඛනයෙන්EnumSet : iterator ක්‍රමය මඟින් ආපසු ලබා දෙන iterator ඒවායේ ස්වාභාවික අනුපිළිවෙලෙහි (එනුම් නියතයන් ප්‍රකාශයට පත් කරන අනුපිළිවෙලෙහි ) මූලද්‍රව්‍ය හරහා ගමන් කරයි . පුනරාවර්තන අනුපිළිවෙල ආපසු ලබා දුන් අනුපිළිවෙලට ගැලපෙන බව මෙය සහතික කරයි Enum.values().
ජෙෆ් ජී

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

5

ජාවා 8

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

Java5 + වෙතින්

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

1
සමාවෙන්න. මට තේරුණා akhil_mittal දැනටමත් ඒ හා සමාන පිළිතුරක් පළ කර ඇති බව.
රගු කේ නයාර්

මම Stream.of (o) භාවිතා කළ යුත්තේ කවදාද සහ ඇයි? For loop වඩා කියවිය හැකි බව පෙනේ.
ජෙරමි

ඔබ ක්‍රියාකාරී වැඩසටහන්කරණය ගැන හුරුපුරුදු නම් නොවේ.
ඇලෙක්සිස් ඩුෆ්රෙනෝයි

5

එක් එක් සඳහා භාවිතා කිරීමට උත්සාහ කරන්න

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

4

ජාවා 8 හි තවත් ක්‍රම:

EnumSetසමඟ භාවිතා කිරීමforEach

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

Arrays.asListසමඟ භාවිතා කිරීමforEach

Arrays.asList(Direction.values()).forEach(...);

0

අපට මේ වගේ පෙරනයක් (JAVA 8) භාවිතා කළ හැකිය.

Stream.of(Direction.values()).filter(name -> !name.toString().startsWith("S")).forEach(System.out::println);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.