L'ordine degli ordini può essere qualsiasi cosa, ma l'ordine delle regole non dovrebbe cambiare. Anche per una particolare regola d'ordine dovrebbe venire in un gruppo.
In tal caso, non c'è spazio per il parallelismo reale.
quando
order1-rule1
order1-rule2
order2-rule1
order2-rule2
e
order2-rule1
order2-rule2
order1-rule1
order1-rule2
sono le uniche corse valide per 2 ordini e 2 regole
e
order1-rule1
order2-rule1
order1-rule2
order2-rule2
è considerato non valido, cioè non parallelismo, solo randomizzazione di orders, presumibilmente senza guadagno. Se sei "annoiato" di order1venire sempre per primo, puoi mescolare l'elenco, ma questo è tutto:
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);
});
});
}
Non è nemmeno necessario lo streaming, solo due loop nidificati. 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
Risposta originale
Ma sta cambiando l'ordine rules.forEach (rule -> {}}.
No non lo fa. Le orders possono sovrapporsi, ma l'ordine di rules per ciascun ordine viene mantenuto. Perché un non parallelo dovrebbe forEachfare qualcos'altro?
Codice di esempio:
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
Esempio di output:
order2-rule1
order2-rule2
order2-rule3
order1-rule1
order1-rule2
order1-rule3
order4-rule1
order4-rule2
order4-rule3
order3-rule1
order3-rule2
order3-rule3
L'ordine di orders è misto, ma i rules sono sempre 1-2-3. Penso che il tuo output abbia semplicemente nascosto gli accoppiamenti (in realtà non hai mostrato come è stato generato).
Naturalmente può essere esteso con alcuni ritardi, quindi l'elaborazione di orders si sovrapporrà effettivamente:
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
Esempio di output:
order3-rule1
order2-rule1
order2-rule2
order3-rule2
order3-rule3
order2-rule3
order1-rule1
order4-rule1
order1-rule2
order4-rule2
order4-rule3
order1-rule3
Questo potrebbe essere qualcosa che hai visto, senza la orderxparte. Con la orders visibile può essere rintracciato che rulecontinua a venire come 1-2-3, perorder . Inoltre, la tua lista di esempi conteneva order1due volte che sicuramente non aiutavano a vedere cosa stava succedendo.