Die Reihenfolge der Bestellungen kann beliebig sein, aber die Reihenfolge der Regeln sollte sich nicht ändern. Auch für eine bestimmte Bestellung sollte Regel in einer Gruppe kommen.
Wenn dies der Fall ist, gibt es keinen Raum für tatsächliche Parallelität.
Wann
order1-rule1
order1-rule2
order2-rule1
order2-rule2
und
order2-rule1
order2-rule2
order1-rule1
order1-rule2
sind die einzigen gültigen Läufe für 2 Bestellungen und 2 Regeln,
und
order1-rule1
order2-rule1
order1-rule2
order2-rule2
wird als ungültig angesehen, das heißt nicht Parallelität, sondern Randomisierung von order
s, vermutlich ohne Gewinn. Wenn Sie sich "langweilen" order1
, immer an erster Stelle zu stehen, können Sie die Liste mischen, aber das ist alles:
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);
});
});
}
Es ist nicht einmal Streaming erforderlich, nur zwei verschachtelte Schleifen. Test: 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
Ursprüngliche Antwort
Aber es ändert die Regeln für jede (Regel -> {}} Reihenfolge.
Nein, tut es nicht. Dasorder
s kann sich überlappen, aber die Reihenfolge von rule
s für jede Reihenfolge wird beibehalten. Warum sollte ein Nicht-Paralleler forEach
etwas anderes tun?
Beispielcode:
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);
});
});
}
Test: https://ideone.com/95Cybg
Beispielausgabe:
order2-rule1
order2-rule2
order2-rule3
order1-rule1
order1-rule2
order1-rule3
order4-rule1
order4-rule2
order4-rule3
order3-rule1
order3-rule2
order3-rule3
Die Reihenfolge von order
s ist gemischt, aber die rule
s sind immer 1-2-3. Ich denke, Ihre Ausgabe hat die Paarungen einfach versteckt (tatsächlich haben Sie nicht gezeigt, wie sie generiert wurden).
Natürlich kann es mit einigen Verzögerungen verlängert werden, also Verarbeitung von order
s tatsächlich überschneidet:
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);
});
});
}
Test: https://ideone.com/cSFaqS
Beispielausgabe:
order3-rule1
order2-rule1
order2-rule2
order3-rule2
order3-rule3
order2-rule3
order1-rule1
order4-rule1
order1-rule2
order4-rule2
order4-rule3
order1-rule3
Dies kann etwas sein, was Sie gesehen haben, nur ohne das orderx
Teil. Mit dem order
sichtbaren s kann verfolgt werden, dass rule
s immer wieder als 1-2-3 pro kommtorder
. Außerdem enthielt Ihre Beispielliste order1
zweimal, was sicherlich nicht dazu beitrug, zu sehen, was geschah.