Порядок заказов может быть любым, но порядок правил не должен меняться. Также для определенного порядка правило должно прийти в группу.
Если это так, нет места для фактического параллелизма.
когда
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
считается недействительным, это не параллелизм, а просто рандомизация orders, предположительно без усиления. Если вам «надоело» 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);
});
});
}
Даже потоковая передача не нужна, просто две вложенные петли. Тест: 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ы могут перекрывать друг друга, но порядок ruleс для каждого заказа сохраняются. Почему непараллельный должен 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
Порядок orders смешан, но rules всегда 1-2-3. Я думаю, что ваш вывод просто скрыл пары (на самом деле вы не показали, как это было сгенерировано).
Конечно, это может быть расширено с некоторыми задержками, поэтому обработка orders будет фактически перекрываться:
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видимыми s можно отследить, что rules продолжают прибывать как 1-2-3, перorder . Кроме того, ваш список примеров содержал order1дважды, что наверняка не помогло увидеть, что происходит.