順序は何でもかまいませんが、ルールの順序は変更しないでください。また、特定の注文ルールはグループに入れるべきです。
その場合、実際の並列処理の余地はありません。
いつ
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);
});
});
}
ストリーミングも必要ありません。入れ子になった2つのループだけです。テスト: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
元の答え
しかし、rules.forEach(rule-> {}}の順序を変更しています。
いいえ、違います。order
sが重複してもよいが、順rule
各注文のSが保持されます。非パラレル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
s の順序は混在していますが、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
追跡することができ、可視だrule
sは、1-2-3のようにくるごとorder
。また、サンプルリストにはorder1
2度含まれていますが、何が起こっているのかを確認するのに役立ちませんでした。