জাভাতে একটি এনামের উপর পুনরাবৃত্তি করতে লুপের জন্য একটি


875

enumমূল এবং মধ্যবর্তী দিকের জন্য আমার জাভাতে একটি রয়েছে:

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

আমি কীভাবে forএই লুপটির প্রতিটিটির মধ্য দিয়ে পুনরুক্তি করতে পারি enum?


উত্তর:


1400

.values()

আপনি values()আপনার এনামে পদ্ধতিটি কল করতে পারেন ।

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

এই values()পদ্ধতিটি সংকলক সুস্পষ্টভাবে ঘোষণা করে । সুতরাং এটি Enumনথিতে তালিকাভুক্ত নয় ।


43
কেন এই পদ্ধতির মানগুলি () এখানে java.lang.enum এর অধীনে তালিকাভুক্ত নয়
জ্যাকট্রেডস

80
@ জ্যাকট্রেডস: এটি একটি অন্তর্নিহিত পদ্ধতি যা কেবলমাত্র সংকলকটিতে বিদ্যমান। অতএব বেস শ্রেণিটি একই নামের সাথে কোনও পদ্ধতি ঘোষণা করতে পারে না এবং এটি স্বয়ংক্রিয়ভাবে উত্পন্ন জাভাডোকগুলিতে অন্তর্ভুক্ত হয় না। docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.2
Torben

4
অদ্ভুতভাবে, এটি মান Of () ডক্সে
গ্রেগ 7gkb

129

একটি এনাম ধরণের সমস্ত ধ্রুবকগুলি এই ধরণের অন্তর্নিহিত public static T[] values()পদ্ধতিতে কল করে পাওয়া যায় :

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

@ রেন্ডারস00 সত্য তবে তবুও উত্তরটি বৈধ এবং ফর্ম্যাটটি আসলেই গুরুত্বপূর্ণ নয় (কমপক্ষে আমার কাছে)
darkpRINCE

কি করে #?
YoTengoUnLCD

@ YoTengoUnLCD মূলত এটি বলছে যে মানগুলি () এনাম অবজেক্টের অংশ। যেমন Enum#values()=Enum.values()
স্পটলাইট

হুঁ, আমি দুঃখিত, আমি অনুসরণ করি না, এটি কি .(সর্বদা?) ব্যবহারের মতো ?
YoTengoUnLCD

3
@ YoTengoUnLCD হ্যাশট্যাগটি জাভাডোক সিনট্যাক্স, জাভা কোড নয়।
জেফ জি

62

আপনি নিম্নলিখিত হিসাবে এটি করতে পারেন:

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

1
আপনি java.util.EnumSet
নট

8
জাভা 8 ফোরচ লুপগুলির জন্য সুপার দরকারী। EnumSet.allOf (Enum.class) .Each (ব্লাহ -> পদ্ধতি (ব্লাহ))
হিরো 2k

1
@ হিরো 2 কে আপনিও করতে পারেন Arrays.stream(Enum.values()).forEach(...)- স্ট্রিমটি অনুক্রমিক হবে
RAnders00

1
@ ভালভাবে ছড়িয়ে দিন, এটি এর setপরিবর্তে একটি array। এটি "আরও ভাল" নয়, যদিও এটি আমার মতে এনাম মানগুলিকে আরও ভালভাবে বর্ণনা করে, কারণ সেটের সংজ্ঞা থেকে, সেটের মানগুলি পুনরাবৃত্তি করা যায় না (এনামের মতো), তবে অ্যারেতে মানগুলি হতে পারে।
জিজোর

2
@ জিজর এটি যখন আপনার বিট ফ্ল্যাগের মতো খুব দ্রুত এনামগুলির খুব দ্রুত সেট প্রয়োজন হয় তবে এটি একটি সহজ পছন্দ যা সাধারণ পুনরাবৃত্তির জন্য খুব জটিল বলে মনে হচ্ছে।
স্কেচেন

44

প্রবাহের

জাভা 8 এর আগে

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

জাভা 8

আমরা ল্যাম্বদা এবং স্ট্রিমগুলিও ব্যবহার করতে পারি ( টিউটোরিয়াল ):

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

কেন forEachOrderedএবং forEachস্ট্রিম দিয়ে নয় ?

এর আচরণটি forEachসুস্পষ্টভাবে নিরপেক্ষবাদী যেখানে forEachOrderedস্ট্রিমটির প্রতিটি এনকন্টারের ক্রম হিসাবে এই স্ট্রিমের প্রতিটি উপাদানটির জন্য ক্রিয়া সম্পাদন করে যদি স্ট্রিমটির একটি সংজ্ঞায়িত ক্রম থাকে order সুতরাং forEachআদেশ রাখা হবে যে গ্যারান্টি দেয় না।

এছাড়াও স্ট্রিমগুলির সাথে কাজ করার সময় (বিশেষত সমান্তরালগুলি) স্ট্রিমের প্রকৃতি মনে রাখে। অনুযায়ী ডক :

স্ট্রিম পাইপলাইন ফলাফলগুলি নির্বিচারে বা ভুল হতে পারে যদি স্ট্রিম ক্রিয়াকলাপের আচরণগত পরামিতিগুলি রাষ্ট্রীয় হয়। একটি রাষ্ট্রীয় ল্যাম্বডা হ'ল যার ফলশ্রুতি কোনও স্ট্রিমের উপর নির্ভর করে যা স্ট্রিম পাইপলাইন প্রয়োগের সময় পরিবর্তিত হতে পারে।

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

এখানে, যদি ম্যাপিং অপারেশনটি সমান্তরালভাবে সম্পাদিত হয় তবে থ্রেড শিডিয়ুলিং পার্থক্যের কারণে একই ইনপুটটির ফলাফল রান থেকে চালানোতে পৃথক হতে পারে, অন্যদিকে, রাষ্ট্রবিহীন ল্যাম্বডা অভিব্যক্তির সাহায্যে ফলাফল সর্বদা একই থাকে।

স্ট্রিম অপারেশনের আচরণগত পরামিতিগুলির পার্শ্ব-প্রতিক্রিয়াগুলি সাধারণভাবে নিরুৎসাহিত করা হয় কারণ তারা প্রায়শই রাষ্ট্রহীনতার প্রয়োজনীয়তার অযাচিত লঙ্ঘন হতে পারে, পাশাপাশি থ্রেড-সুরক্ষা অন্যান্য ঝুঁকির কারণ হতে পারে।

স্ট্রিমগুলির সংজ্ঞাযুক্ত অর্ডার থাকতে পারে এবং নাও থাকতে পারে। কোনও স্ট্রিমের একটি এনকাউন্টার অর্ডার রয়েছে কিনা তা উত্স এবং মধ্যবর্তী ক্রিয়াকলাপগুলির উপর নির্ভর করে।


সমস্ত স্ট্রিম অপারেশনের মতোই থ্রেডের স্ট্যাটাসহীনতা এবং পার্শ্বপ্রতিক্রিয়া সীমাবদ্ধতার বিষয়ে সচেতন থাকুন ডকস.অরাকল . com/ জাভাসে / 8 / ডকস / এপি / জাভা / ইউটিল / স্ট্রিম /।। এই 2 এনাম পুনরাবৃত্তি বিকল্পগুলি এই ক্ষেত্রে উল্লেখযোগ্যভাবে পৃথক।
buzz3791


19

আপনি যদি অর্ডারটি নিয়ে কাজ করেন তবে তা যত্নশীল না হন:

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

2
আপনি java.util.EnumSet এবং java.util.Set আমদানি করুন
নট

4
এর জন্য ডকুমেন্টেশন থেকেEnumSet : পুনরুক্তি পদ্ধতি দ্বারা ফিরে আসা পুনরুক্তিকারীগুলি তাদের প্রাকৃতিক ক্রমে উপাদানগুলি (যে ক্রমে এনাম ধ্রুবকগুলি ঘোষিত হয় )টিকে অনুসরণ করে । এটি গ্যারান্টি দেয় যে পুনরাবৃত্তির ক্রমটি ফিরে আসা অর্ডারটির সাথে মেলে Enum.values()
জেফ জি


5

Java8

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

জাভা 5 + থেকে

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

1
ওহ দুঃখিত. আমি ঠিক বুঝতে পেরেছি যে, ইতিমধ্যে অখিল_মিটাল অনুরূপ উত্তর পোস্ট করেছে।
রঘু কে নায়ার

কখন এবং কেন আমার স্ট্রিম.ওফ (ও) ব্যবহার করা উচিত? লুপটি আরও বেশি পঠনযোগ্য বলে মনে হচ্ছে।
জেরেমি

আপনি যদি ক্রিয়ামূলক প্রোগ্রামিংয়ের সাথে পরিচিত হন তবে তা নয়।
অ্যালেক্সিস ডুফরনয়

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(...);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.