ลำดับของการสั่งซื้อสามารถเป็นอะไรก็ได้ แต่ลำดับของกฎไม่ควรเปลี่ยนแปลง นอกจากนี้สำหรับกฎการสั่งซื้อเฉพาะควรมาเป็นกลุ่ม
หากเป็นเช่นนั้นจะไม่มีที่ว่างสำหรับการขนานที่แท้จริง
เมื่อไหร่
order1-rule1
order1-rule2
order2-rule1
order2-rule2
และ
order2-rule1
order2-rule2
order1-rule1
order1-rule2
เป็นการทำงานที่ถูกต้องเพียงครั้งเดียวสำหรับ 2 คำสั่งซื้อและ 2 กฎ
และ
order1-rule1
order2-rule1
order1-rule2
order2-rule2
ถือว่าไม่ถูกต้องที่ไม่ขนานกันเพียงแค่การสุ่มของorder
s สันนิษฐานว่าไม่มีกำไร หากคุณ "เบื่อ" โดยorder1
มาก่อนเสมอคุณสามารถสลับรายการได้ แต่นั่นคือทั้งหมด:
public static void main (String[] args) throws java.lang.Exception
{
List<String> orders = Arrays.asList("order1", "order2", "order3", "order4");
List<String> rules = Arrays.asList("rule1", "rule2", "rule3");
Collections.shuffle(orders);
orders.forEach(order->{
rules.forEach(rule->{
System.out.println(order+"-"+rule);
});
});
}
ไม่จำเป็นต้องมีการสตรีมแม้แต่เพียงสองลูปซ้อนกัน ทดสอบ: https://ideone.com/qI3dqd
order2-rule1
order2-rule2
order2-rule3
order4-rule1
order4-rule2
order4-rule3
order1-rule1
order1-rule2
order1-rule3
order3-rule1
order3-rule2
order3-rule3
คำตอบเดิม
แต่มันกำลังเปลี่ยนกฎสำหรับคำสั่ง forEach (กฎ -> {}}
ไม่มันไม่ order
s อาจทับซ้อน แต่คำสั่งของrule
สำหรับการสั่งซื้อแต่ละครั้งจะถูกเก็บไว้ เหตุใดคนที่ไม่ขนานกันforEach
จะทำอย่างอื่น
รหัสตัวอย่าง:
public static void main (String[] args) throws java.lang.Exception
{
List<String> orders = Arrays.asList("order1", "order2", "order3", "order4");
List<String> rules = Arrays.asList("rule1", "rule2", "rule3");
orders.stream().parallel().forEach(order->{
rules.forEach(rule->{
System.out.println(order+"-"+rule);
});
});
}
ทดสอบ: https://ideone.com/95Cybg
เอาต์พุตตัวอย่าง:
order2-rule1
order2-rule2
order2-rule3
order1-rule1
order1-rule2
order1-rule3
order4-rule1
order4-rule2
order4-rule3
order3-rule1
order3-rule2
order3-rule3
คำสั่งของorder
ผสมกัน แต่rule
s มักจะ 1-2-3 ฉันคิดว่าผลลัพธ์ของคุณเพียงแค่ซ่อนการจับคู่ (ที่จริงแล้วคุณไม่ได้แสดงว่ามันถูกสร้างขึ้น)
แน่นอนว่าสามารถขยายได้ด้วยความล่าช้าดังนั้นการประมวลผลของorder
s จะทับซ้อนกัน:
public static void delay(){
try{
Thread.sleep(ThreadLocalRandom.current().nextInt(100,300));
}catch(Exception ex){}
}
public static void main (String[] args) throws java.lang.Exception
{
List<String> orders = Arrays.asList("order1", "order2", "order3", "order4");
List<String> rules = Arrays.asList("rule1", "rule2", "rule3");
orders.stream().parallel().forEach(order->{
rules.forEach(rule->{
delay();
System.out.println(order+"-"+rule);
});
});
}
ทดสอบ: https://ideone.com/cSFaqS
ตัวอย่างผลลัพธ์:
order3-rule1
order2-rule1
order2-rule2
order3-rule2
order3-rule3
order2-rule3
order1-rule1
order4-rule1
order1-rule2
order4-rule2
order4-rule3
order1-rule3
นี่อาจเป็นสิ่งที่คุณเห็น แต่ไม่มีorderx
ส่วน ด้วยorder
s มองเห็นว่ามันสามารถติดตามได้ว่าrule
s ให้มาเป็น 1-2-3, ต่อ order
นอกจากนี้รายการตัวอย่างของคุณมีorder1
สองครั้งซึ่งแน่นอนไม่ได้ช่วยในการดูสิ่งที่เกิดขึ้น