2016-03-08 13 views
8

Theo bản đồ, có cả cặp khóa-giá trị dưới dạng Chuỗi, Viết một logic để lọc tất cả các giá trị rỗng từ Bản đồ mà không sử dụng bất kỳ API bên ngoài nào?Làm cách nào để lọc các giá trị "Null" khỏi HashMap <String, String>?

Có cách tiếp cận nào khác hơn là đi ngang qua toàn bộ bản đồ và lọc ra các giá trị (Traversing toàn bộ bản đồ và nhận Object nhập và loại bỏ các cặp)?

 Map<String,String> map = new HashMap<String,String>(); 

     map.put("1", "One"); 
     map.put("2", "Two"); 
     map.put("3", null); 
     map.put("4", "Four"); 
     map.put("5", null); 
     //Logic to filer values 
     //Post filtering It should print only (1,2 & 4 pair) 
+3

Không, có isn' t. Các traversal (nó chỉ là một vòng lặp) sẽ hoặc là trong mã của bạn hoặc trong mã JDK (suối, vv), nhưng sẽ cần phải có một vòng lặp. –

+4

Nếu bạn không muốn cho phép 'null' ở vị trí đầu tiên, bạn có thể phân lớp nó và ghi đè phương thức' put'. – Maroun

Trả lời

49

Bạn có thể sử dụng java 8 phương pháp Collection.removeIf cho mục đích này:

map.values().removeIf(Objects::isNull); 

này loại bỏ tất cả các giá trị mà là null.

Online demo

4

rằng sẽ làm việc

Map<String, String> result = map.entrySet() 
    .stream() 
    .filter(e -> e.getValue() != null) 
    .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue())); 
+0

oh, xin lỗi. điều này chỉ hoạt động đối với luồng. Chúng tôi có thể chuyển đổi thành và từ luồng, hãy để tôi cập nhật câu trả lời của mình. – jberndsen

14

Nếu bạn đang sử dụng pre-Java 8, bạn có thể sử dụng:

Collection<String> values = map.values(); 
while (values.remove(null)) {} 

này hoạt động vì HashMap.values() trả một cái nhìn của giá trị và:

Bộ sưu tập [được trả về bởi HashMap.values()] hỗ trợ loại bỏ yếu tố, trong đó loại bỏ các bản đồ tương ứng từ bản đồ, thông qua Iterator.remove, Set.remove, RemoveAll, retainAll, và các hoạt động rõ ràng

+2

Có! Nhưng tôi nghĩ rằng bạn có thể làm cho nó * thậm chí nhỏ hơn * bằng cách sử dụng 'values.removeAll (Arrays.asList (null))'. –

+0

Cảm ơn Andy vì giải pháp. Tôi đã thử với giải pháp của bạn. Nó hoạt động tốt. – RaBa

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