ฉันมีenum
Java สำหรับทิศทางสำคัญ & กลาง:
public enum Direction {
NORTH,
NORTHEAST,
EAST,
SOUTHEAST,
SOUTH,
SOUTHWEST,
WEST,
NORTHWEST
}
ฉันจะเขียน
for
ลูปที่วนซ้ำผ่านแต่ละenum
ค่าเหล่านี้ได้อย่างไร
ฉันมีenum
Java สำหรับทิศทางสำคัญ & กลาง:
public enum Direction {
NORTH,
NORTHEAST,
EAST,
SOUTHEAST,
SOUTH,
SOUTHWEST,
WEST,
NORTHWEST
}
ฉันจะเขียน
for
ลูปที่วนซ้ำผ่านแต่ละenum
ค่าเหล่านี้ได้อย่างไร
คำตอบ:
.values()
คุณสามารถเรียกvalues()
วิธีการใน enum ของคุณ
for (Direction dir : Direction.values()) {
// do what you want
}
นี้values()
วิธีการที่ประกาศโดยปริยายคอมไพเลอร์ ดังนั้นจึงไม่ปรากฏในEnum
เอกสาร
ค่าคงที่ทั้งหมดของชนิด enum สามารถรับได้โดยการเรียกpublic static T[] values()
เมธอดimplicit ของชนิดนั้น:
for (Direction d : Direction.values()) {
System.out.println(d);
}
#
ทำอย่างไร
Enum#values()
=Enum.values()
.
(เสมอหรือไม่)?
คุณสามารถทำได้ดังนี้:
for (Direction direction : EnumSet.allOf(Direction.class)) {
// do stuff
}
Arrays.stream(Enum.values()).forEach(...)
- สตรีมจะต่อเนื่องกัน
set
array
ไม่ใช่ "ดีกว่า" ถึงแม้ว่ามันจะอธิบายค่า enum ที่ดีกว่าในความคิดของฉันเพราะจากคำจำกัดความของชุดค่าในชุดไม่สามารถทำซ้ำได้ (เช่นใน enum) ในขณะที่ค่าในอาร์เรย์สามารถเป็นได้
for (Direction dir : Direction.values()) {
System.out.println(dir);
}
เราสามารถใช้แลมบ์ดาและสตรีม ( บทช่วยสอน ):
Stream.of(Direction.values()).forEachOrdered(System.out::println);
ทำไมforEachOrdered
และไม่ใช่forEach
กับสตรีม
พฤติกรรมของforEach
คือ nondeterministic อย่างชัดเจนโดยที่การforEachOrdered
ดำเนินการสำหรับแต่ละองค์ประกอบของสตรีมนี้ในลำดับการเผชิญหน้าของสตรีมหากสตรีมมีลำดับการเผชิญหน้าที่กำหนดไว้ ดังนั้นforEach
ไม่รับประกันว่าคำสั่งจะถูกเก็บไว้
นอกจากนี้เมื่อทำงานกับสตรีม (โดยเฉพาะอย่างยิ่งคู่ขนาน) โปรดคำนึงถึงธรรมชาติของสตรีม ตามเอกสาร :
ผลลัพธ์ไปป์ไลน์ของสตรีมอาจไม่ได้กำหนดไว้หรือไม่ถูกต้องหากพารามิเตอร์พฤติกรรมไปยังการดำเนินการของสตรีมนั้นเป็นของรัฐ แลมบ์ดาแบบรัฐเป็นสิ่งที่ผลลัพธ์ขึ้นอยู่กับสถานะใด ๆ ซึ่งอาจเปลี่ยนแปลงได้ในระหว่างการดำเนินการไปป์ไลน์
Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...
ที่นี่หากการดำเนินการทำแผนที่ในแบบขนานผลลัพธ์สำหรับอินพุตเดียวกันอาจแตกต่างกันไปจากการวิ่งเพื่อทำงานเนื่องจากความแตกต่างของการจัดตารางเวลาด้ายในขณะที่ด้วยการแสดงออกแลมบ์ดา stateless ผลลัพธ์จะเหมือนกันเสมอ
ผลข้างเคียงในพารามิเตอร์พฤติกรรมในการทำงานของการสตรีมนั้นโดยทั่วไปหมดกำลังใจเพราะพวกเขามักจะนำไปสู่การละเมิดความต้องการไร้สัญชาติโดยไม่รู้ตัวรวมทั้งอันตรายจากความปลอดภัยของด้ายอื่น ๆ
ลำธารอาจมีหรือไม่มีคำสั่งเผชิญหน้า การสตรีมนั้นมีลำดับการเผชิญหน้าหรือไม่นั้นขึ้นอยู่กับแหล่งที่มาและการดำเนินการระดับกลาง
for(Direction dir : Direction.values())
{
}
หากคุณไม่สนใจคำสั่งนี้ควรใช้งานได้:
Set<Direction> directions = EnumSet.allOf(Direction.class);
for(Direction direction : directions) {
// do stuff
}
EnumSet
: iterator ที่ส่งกลับโดยวิธี iterator ลัดเลาะองค์ประกอบในของพวกเขาเพื่อธรรมชาติ (ลำดับที่ค่าคงที่ enum จะประกาศ) Enum.values()
การค้ำประกันนี้ว่าคำสั่งของย้ำตรงกับคำสั่งซื้อที่ส่งกลับโดย
for (Direction d : Direction.values()) {
//your code here
}
Java8
Stream.of(Direction.values()).forEach(System.out::println);
จาก Java5 +
for ( Direction d: Direction.values()){
System.out.println(d);
}
ลองใช้ a สำหรับแต่ละอัน
for ( Direction direction : Direction.values()){
System.out.println(direction.toString());
}
วิธีการเพิ่มเติมใน java 8:
EnumSet
กับforEach
EnumSet.allOf(Direction.class).forEach(...);
Arrays.asList
กับforEach
Arrays.asList(Direction.values()).forEach(...);