2012-05-17 31 views
29

Nếu tôi muốn tạo một Multimap mới với giá trị mặc định đơn giản, tôi curently cần phải làm điều gì đó như:Cách nhỏ gọn để tạo Multimaps ổi?

private final Multimap<Key, Value> providersToClasses = Multimaps 
     .newListMultimap(
       new HashMap<Key, Collection<Value>>(), 
       new Supplier<List<Value>>() { 
        @Override 
        public List<Value> get() { 
         return Lists.newArrayList(); 
        } 
       }); 

vì Java không thể suy ra các loại đúng nếu Maps.newHashMap được sử dụng cho bản đồ ủng hộ. Tất nhiên, điều này có thể được tái cấu trúc thành một phương pháp riêng biệt, nhưng có cách nào để viết nó ngắn gọn hơn không?

Trả lời

49

Tại sao bạn không sử dụng ArrayListMultimap.create() cho trường hợp đơn giản như vậy? Đó là cách mặc định để tạo HashMap/ArrayList đơn giản mà có lẽ là đa phương tiện được sử dụng phổ biến nhất.

+2

Tôi nghĩ bạn có nghĩa là 'ArrayListMultimap'.'HashMultimap' là cho' HashMap'/'HashSet'. –

+0

Vâng, ý tôi là ArrayListMultimap. Cảm ơn bạn đã chỉnh sửa. –

+3

Vì tôi đang tìm lớp sai ('Multimaps') :) –

2

Để trả lời vấn đề suy luận kiểu gốc, bạn cũng có thể chỉ định kiểu chung trên phương pháp tĩnh sử dụng Maps.<Key, Collection<Value>>newHashMap(), nhưng chắc chắn không ngắn gọn hơn new HashMap<Key, Collection<Value>>() (có thể nhất quán hơn).

7

Tôi gặp phải sự cố này khi viết khách hàng và xây dựng bản đồ của thông số truy vấn. Một mô hình gọn gàng đẹp Tôi thích để xây dựng multimaps là sử dụng ImmutableMultiMap#builder

Multimap<String, String> queryParams = 
    ImmutableMultimap.<String, String>builder() 
    .put("key-1", "value-1") 
    .put("key-1", "value-2") 
    .build(); 
3

Trong Java 8 này là đẹp hơn nhiều, cho tất cả các loại multimaps. Đây là vì hai lý do:

Nó trông như thế này:

Multimap<Key, Value> providersToClasses = 
    Multimaps.newListMultimap(new HashMap<>(), ArrayList::new); 
4

Đây là giải pháp nhỏ gọn:

Multimap<Integer, String> multi = HashMultimap.create(); 
6

Các Guava documentation bang rằng create phương pháp ủng hộ bởi một số câu trả lời khác "sẽ sớm được phản" ủng hộ các hình thức khác nhau được trình bày dưới đây, và do đó nên tránh.

Từ Ổi 21,0 trở đi, cách khuyến khích việc tạo ra một đối tượng Multimap nơi các giá trị được lưu trữ trong ArrayList bộ sưu tập như sau:

MultimapBuilder.hashKeys().arrayListValues().build(); 

Bạn cũng có thể sử dụng các thông số nếu bạn muốn chỉ định số lượng dự kiến các khóa trong bản đồ của bạn và số lượng giá trị dự kiến ​​cho mỗi khóa:

MultimapBuilder.hashKeys(expectedKeys).arrayListValues(expectedValuesPerKey).build(); 

Cuối cùng, bạn có thể tạo mới Multimap từ một tồn tại ing một cách sử dụng cấu trúc này:

MultimapBuilder.hashKeys().arrayListValues().build(multimap); 

Nếu bạn muốn sử dụng cấu trúc dữ liệu khác ngoài ArrayLists trong Multimap của bạn, bạn có thể thay thế các cuộc gọi đến arrayListValues() bởi một số những người khác, được liệt kê here.

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