2015-01-08 24 views
12

Tôi rất mới với các tính năng mới của Java 8. Tôi đang học cách lọc bản đồ theo mục. Tôi đã xem xét this tutorialthis post cho vấn đề của mình, nhưng tôi không thể giải quyết được.Java 8 Lambda, lọc HashMap, không thể giải quyết phương thức

@Test 
public void testSomething() throws Exception { 
    HashMap<String, Integer> map = new HashMap<>(); 
    map.put("1", 1); 
    map.put("2", 2); 
    map = map.entrySet() 
      .parallelStream() 
      .filter(e -> e.getValue()>1) 
      .collect(Collectors.toMap(e->e.getKey(), e->e.getValue())); 
} 

Tuy nhiên, IDE của tôi (IntelliJ) nói "Không thể giải quyết phương pháp 'getKey()'", do đó không có khả năng hãy biên dịch: enter image description here

Cũng không trợ giúp này: enter image description here
bất cứ ai có thể giúp tôi để giải quyết vấn đề này? Cảm ơn.

+0

nếu tôi có thể hỏi .. chính xác ** ** là gì .. không thấy nó được khai báo ở bất cứ đâu .. – Olu

+0

@tobias_k, không phải là vấn đề liên quan đến generics. Nó sẽ hoạt động theo http://www.leveluplunch.com/java/examples/filter-map-by-value/ – Daniel

+1

@FlorentBayle thêm phép đúc này (HashMap ) giúp! – Daniel

Trả lời

27

Thông báo gây hiểu lầm nhưng mã của bạn không biên dịch vì một lý do khác: collect trả lại Map<String, Integer> không phải là HashMap.

Nếu bạn sử dụng

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

nó cũng làm việc như mong đợi (cũng chắc chắn rằng bạn có tất cả các hàng nhập khẩu có liên quan).

+1

Rõ ràng nó sẽ mất * một số * thời gian cho trình biên dịch để có đủ thông minh về nguyên nhân thực sự của một lỗi. Khá bực bội vào lúc này ... –

+0

Nếu chúng ta bỏ đi những gì được trả về bởi .collect bởi (HashMap ), nó xuất hiện để làm việc. Nhưng có vấn đề gì về việc đúc không? – Daniel

+0

Tôi luôn thích tạo cấu trúc dữ liệu từ các giao diện, Danh sách, Bản đồ e.t.c. – Olu

4

Bạn đang quay trở lại Bản đồ không phải là bản đồ băm nên bạn cần phải thay đổi map loại thành java.util.Map. Hơn nữa, bạn có thể sử dụng tham chiếu phương thức thay vì gọi getKey, getValue. Ví dụ.

Map<String, Integer> map = new HashMap<>(); 
     map.put("1", 1); 
     map.put("2", 2); 
     map = map.entrySet() 
       .parallelStream() 
       .filter(e -> e.getValue() > 1) 
       .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 

Bạn cũng có thể giải quyết bằng cách sử dụng một số trợ giúp intellij cho ví dụ: nếu bạn nhấn ctrl+alt+v trước

new HashMap<>(); 
      map.put("1", 1); 
      map.put("2", 2); 
      map = map.entrySet() 
        .parallelStream() 
        .filter(e -> e.getValue() > 1) 
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 

Biến được tạo bởi intellij sẽ có loại chính xác và bạn sẽ nhận được.

Map<String, Integer> collect = map.entrySet() 
     .parallelStream() 
     .filter(e -> e.getValue() > 1) 
     .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 
+0

ctrl + alt + v thật tuyệt vời – Daniel

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