주문 순서는 무엇이든 가능하지만 규칙 순서는 바뀌지 않아야합니다. 또한 특정 주문 규칙에 대해서는 그룹으로 와야합니다.
이 경우 실제 병렬 처리의 여지가 없습니다.
언제
order1-rule1
order1-rule2
order2-rule1
order2-rule2
과
order2-rule1
order2-rule2
order1-rule1
order1-rule2
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
s 순서는 유지됩니다. 평행 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
볼이야는 것을 추적 할 수 있습니다 rule
들, 1-2-3로 계속오고 당order
. 또한 예제 목록에는 order1
두 번 포함되어 있어서 무슨 일이 일어나고 있는지 알 수 없었습니다.