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 order
s, sans doute sans gain. Si vous "vous ennuyez" en order1
venant 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 order
s peuvent se chevaucher, mais l'ordre des rule
s pour chaque commande est conservé. Pourquoi un non-parallèle forEach
ferait-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 order
s est mixte, mais les rule
s 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 order
s 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 orderx
partie. Avec le order
s visible, il peut être suivi que rule
s continue à venir comme 1-2-3, parorder
. De plus, votre liste d'exemples contenait order1
deux fois, ce qui n'a certainement pas aidé à voir ce qui se passait.