티스토리 뷰

CS/Java

break가 필요하다면 for loop를 사용하자

기억용블로그 2022. 6. 23. 14:11
728x90

forEach로 이중 for문을 돌면서 if문에 부합하면 값을 set하는 함수를 작성했다.

 

for (ItemResponse itemResponse : itemResponses) {
    for (Zzim zzim : zzims) {
        if (itemResponse.getItemId().equals(zzim.getItem().getId())) {
            itemResponse.setIsZzimed(zzim.getIsZzimed());
            break;
        }
    }
}

 

모양새가 영 마음에 들지 않아 최대한 스트림으로 변환해서 사용하고자 했다.

익명의 유저에게 도움을 받아 작성한 스트림 코드는 다음과 같다.

 

itemResponses.forEach(itemResponse -> {
    zzims.stream().filter(zzim -> itemResponse.getItemId().equals(zzim.getItem().getId()))
            .forEach(zzim -> {
                itemResponse.setIsZzimed(zzim.getIsZzimed());
            });
});

 

가독성면에서 더 괜찮아보여서 사용하고자 했고 성능에 큰 차이가 없다면 그대로 사용하려고 성능 테스트를 진행해보았다.

 

final long start = System.nanoTime();
itemResponses.forEach(itemResponse -> {
    zzims.stream().filter(zzim -> itemResponse.getItemId().equals(zzim.getItem().getId()))
            .forEach(zzim -> {
                itemResponse.setIsZzimed(zzim.getIsZzimed());
            });
});
final long end = System.nanoTime();
System.out.println(end - start);
//981500

 

final long start = System.nanoTime();
for (ItemResponse itemResponse : itemResponses) {
    for (Zzim zzim : zzims) {
        if (itemResponse.getItemId().equals(zzim.getItem().getId())) {
            itemResponse.setIsZzimed(zzim.getIsZzimed());
            break;
        }
    }
}
final long end = System.nanoTime();
System.out.println(end - start);
//56200

 

단 10건의 테스트를 진행했음에도 20배의 시간 차이가 났다! (단위 : ns)

(여러번 실행하여 캐싱하는 시간은 제외시켰다.)

 

 

문제는 forEach와 break

원인은 forEach에 있었다.

forEach는 해당하는 값을 찾더라도 고전적인 for loop에서처럼 break;를 할 수 없어 이중 포문을 다 돌아야 한다.

 

때문에 해당하는 값을 찾고 종료해야 하는 경우에는 고전적인 for loop를 사용해야 한다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함