L'ordre des commandes peut être n'importe quoi, mais l'ordre des règles ne doit pas changer. Aussi pour une règle d'ordre particulière devrait venir dans un groupe.
Si tel est le cas, il n'y a pas de place pour un parallélisme réel.
Quand
order1-rule1
order1-rule2
order2-rule1
order2-rule2
et
order2-rule1
order2-rule2
order1-rule1
order1-rule2
sont les seules séries valides pour 2 commandes et 2 règles,
et
order1-rule1
order2-rule1
order1-rule2
order2-rule2
est considéré comme invalide, ce n'est pas du parallélisme, juste une randomisation de orders, sans doute sans gain. Si vous "vous ennuyez" en order1venant tout le temps en premier, vous pouvez mélanger la liste, mais c'est tout:
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);
});
});
}
Même le streaming n'est pas nécessaire, juste deux boucles imbriquées. 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
Réponse originale
Mais cela modifie l'ordre rules.forEach (rule -> {}}.
Non. Les orders peuvent se chevaucher, mais l'ordre des rules pour chaque commande est conservé. Pourquoi un non-parallèle forEachferait-il autre chose?
Exemple de code:
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
Exemple de sortie:
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'ordre des orders est mixte, mais les rules sont toujours 1-2-3. Je pense que votre sortie a simplement caché les appariements (en fait, vous n'avez pas montré comment elle a été générée).
Bien sûr, il peut être étendu avec quelques retards, donc le traitement des orders se chevauchera en fait:
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
Exemple de sortie:
order3-rule1
order2-rule1
order2-rule2
order3-rule2
order3-rule3
order2-rule3
order1-rule1
order4-rule1
order1-rule2
order4-rule2
order4-rule3
order1-rule3
Cela peut être quelque chose que vous avez vu, juste sans la orderxpartie. Avec le orders visible, il peut être suivi que rules continue à venir comme 1-2-3, parorder . De plus, votre liste d'exemples contenait order1deux fois, ce qui n'a certainement pas aidé à voir ce qui se passait.