2012-06-26 44 views
8

Tôi đang tìm kiếm một số giải pháp thanh lịch để loại bỏ các giá trị null khỏi Danh sách. Tôi đã xem qua các following post, mà nói rằng tôi có thể sử dụng list.removeAll(Collections.singletonList(null));Việc sử dụng singletonList là gì?

này, tuy nhiên, ném một UnsupportedOperationException, mà tôi giả sử là vì removeAll() đang cố gắng để làm một số hoạt động mutative vào bộ sưu tập singleton không thay đổi. Điều này có đúng không?

Nếu trường hợp này xảy ra, điều gì sẽ là cách sử dụng điển hình của danh sách phát này? Để đại diện cho tập hợp kích thước 1 khi bạn chắc chắn bạn không muốn thực sự làm bất kỳ điều gì với bộ sưu tập?

Xin cảm ơn trước.

+0

Bạn đã khai báo danh sách như thế nào? Sử dụng Arrays.asList()? Nếu vậy thì nó sẽ là bất biến – Murugesh

Trả lời

14

Nó hoạt động như một nét duyên dáng:

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] 

Thật vậy Collections.singletonList(null) là bất biến (được may ẩn trong Java [1]), nhưng các ngoại lệ được ném từ biến list của bạn. Rõ ràng nó là không thay đổi là tốt, như trong ví dụ dưới đây:

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

này đang sẽ ném một UnsupportedOperationException. Vì vậy, bạn có thể thấy singletonList() hữu ích trong trường hợp này. Sử dụng nó khi mã máy khách mong đợi một danh sách chỉ đọc (nó sẽ không sửa đổi nó) nhưng bạn chỉ muốn truyền một phần tử trong đó. singletonList() là (thread-) an toàn (do bất biến), nhanh và nhỏ gọn.

[1] Ví dụ: trong có một phân cấp phân tách cho các bộ sưu tập có thể thay đổi và không thay đổi được và API có thể chọn xem nó có chấp nhận hay không (hoặc cả hai, vì chúng có giao diện cơ sở chung)

+0

Đây chính là điều tôi muốn. Tôi đã không biết rằng 'Arrays.asList()' trả về một danh sách bất biến (mặc dù tôi nhớ đọc rằng nó đã được "hỗ trợ bởi mảng được truyền vào nó"). Điều này có thể được sửa bằng cách sử dụng hàm tạo của 'ArrayList (Collection c)': 'new ArrayList (Arrays.asList (someArray)). RemoveAll (Collections.singletonList (null))' – mmoore

0

Danh sách của bạn được bảo vệ với Collections.unmodifiableList (danh sách) ? Bởi vì nếu bạn đã bảo vệ nó và cố gắng sửa đổi nó sau đó bạn nhận được lỗi đó.

Các vấn đề liên quan