리스트 순회하며 특정 조건의 데이터를 삭제하는 로직 구현 중입니다.
코드:
import java.util.*;
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
list.forEach(num -> {
if (num % 2 == 0) {
list.remove(Integer.valueOf(num));
}
});
}
}
오류: java.util.ConcurrentModificationException
시도: for-each 루프 및 Stream filter 적용 시도했으나 기존 리스트 유지하며 삭제해야 함.
질문: 원본 리스트를 유지하면서 Stream 내부에서 안전하게 요소를 제거하는 방법이 무엇입니까?
댓글7
-
빗방울
2026.10.31 05:31
-
빗방울
2026.10.31 05:47
정 안되면 Iterator 써서 remove 하는 게 정석이긴 함.
그게 제일 안전할 듯요ㅋㅋ
-
빗방울
2026.10.31 11:27
맞음ㅋㅋ 옛날 방식 같아도
결국 iterator가 제일 확실하긴 하죠.
-
빗방울
2026.10.31 06:57
아니 근데 굳이 스트림 안에서 지우려고 하시는 이유가 뭐임ㅋㅋ
차라리 필터링해서 새 리스트 만들고 통째로 갈아끼우는 게 정신건강에 좋을 듯요.
-
빗방울
2026.10.31 08:17
그냥 복사본 만들어서 순회하고 원본에서 지우는 건 어떠신가요.
그럼 런타임 에러 안 날 것 같은데ㅋㅋ
한번 해보세요.
-
빗방울
2026.10.31 08:48
CopyOnWriteArrayList 써보심?
이거 쓰면 수정하면서 돌려도 에러 안 날 텐데ㅋㅋ 한번 확인해보세요.
-
빗방울
2026.10.31 12:07
오 그거 괜찮네요ㅋㅋ 근데 데이터 많으면 성능 좀 떨어질 수도 있을 듯요.
모든 이야기1511
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
총 1511개의 이야기
이거 removeIf 쓰면 한 방에 해결될 듯함ㅋㅋ 굳이 스트림 안 써도 됨.