2012-06-26 3 views
8

List에서 null 값을 제거하는 멋진 해결책을 찾고있었습니다. 나는 list.removeAll(Collections.singletonList(null));singletonList의 사용법은 무엇입니까?

이것은, 그러나, removeAll()는 불변 싱글 컬렉션 일부 추이 적 조작을 실행하려고 때문에이 있으리라 믿고있어 UnsupportedOperationException를 슬로우 사용할 수 있다고하는의 following post을 가로 질러왔다. 이 올바른지?

이 경우이 단일 목록의 일반적인 용도는 무엇입니까? 컬렉션에서 실제로 아무것도하고 싶지 않을 때 크기 1의 컬렉션을 나타내려면?

미리 감사드립니다.

+0

목록을 어떻게 선언 했습니까? Arrays.asList() 사용? 그렇다면 불변이 될 것입니다. – Murugesh

답변

14

그것은 마법처럼 작동합니다

List<String> list = new ArrayList<String>(); 
list.add("abc"); 
list.add(null); 
list.add("def"); 
list.removeAll(Collections.singletonList(null)); 
System.out.println(list); //[abc, def] 

가 실제로 Collections.singletonList(null)은 불변 (불행히도 자바 에 숨겨져 [1]하는)하지만 예외가 당신의 list 변수에서 발생합니다. 분명히 그것은 아래의 예처럼,뿐만 아니라 불변 :

List<String> list = Arrays.asList("abc", null, "def"); 
list.removeAll(Collections.singletonList(null)); 

이 코드 UnsupportedOperationException 발생합니다. 그래서 당신이 볼 수 있듯이 singletonList()이이 경우에 유용합니다. 클라이언트 코드가 읽기 전용 목록을 기대할 때 (그것을 수정하지는 않지만) 오직 하나의 요소 만 전달하고자 할 때 사용하십시오. singletonList()은 빠르고 안정적인 (나사 고정식) 안전하고 신속합니다.

[1] 예 : 에는 변경 가능하고 변경 불가능한 콜렉션에 대한 separete 계층 구조가 있으며 API는 이것을 받아들이는지 또는 다른 것을 받아들이는지 선택할 수 있습니다 (공통 기본 인터페이스를 가지고 있기 때문에 둘 다)

+0

이것은 제가 원한 것입니다. 나는'Arrays.asList()'가 불변의 목록을 반환한다는 것을 알지 못했다. (나는 그것이 "전달 된 배열에 의해 뒷받침되었다"는 것을 읽었지만). 이것은'ArrayList (Collection c)'의 생성자를 사용하여 고칠 수 있습니다 : 'new ArrayList (Arrays.asList (someArray)). removeAll (Collections.singletonList (null))' – mmoore

0

목록이 Collections.unmodifiableList ? 당신이 그것을 보호하고 나중에 그것을 수정하려고하면 당신은 그 오류가 발생합니다.

관련 문제