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