List에서 일부 element를 제거하고 싶을때.

직접 Loop안에서 List.remove 하면 checkForComodification exception이 발생한다.

이를 피하기 위해 보통 빈 List를 만든다음 필요한 element만 List.add로 처리하면 되는데.

Iterator로 해결 할 수 도있다.

Map<String, Object> resultMap = Maps.newHashMap();

List<Map<String, Object>> _itemList =  sqlSession.selectList(NAMESPACE + "selItemList", _param);

for (Iterator<Map<String, Object>> _it = _itemList.iterator(); _it.hasNext();)
{
    Map<String, Object> _item = _it.next();

    if ("Y".equals(_item.get("del_yn"))
    {
        _it.remove();
    }
}

resultMap.put("itemList", _itemList);

return resultMap;

Iterator는 List를 내부적으로 가지고 있으면서 변경사항을 즉각 원본 List에 반영하면서 탐색하기 때문에 Iterator에서 remove하면 원본인 List의 Element에도 반영이 된다.

그래서 Iterator에서 remove만 하고, 그 다음 로직은 변경이 반영된 원본 List로 계속 사용하면 된다. 

 

참조 : [ JAVA ] Iterator 분석 (feat. ArrayList) (tistory.com)