2012-12-21 25 views
10

Câu hỏi này là loại đã được đăng ở đây: How to convert Map<String, String> to Map<Long, String> using guavaTại sao Ổi không cung cấp một cách để chuyển đổi các phím đồ

Tôi nghĩ câu trả lời của CollinD là thích hợp:

Tất cả các phương pháp ổi đối với chuyển và lọc sản xuất các kết quả lười biếng ... chức năng/vị ngữ chỉ được áp dụng khi cần khi đối tượng được sử dụng. Họ không tạo bản sao. Do đó, mặc dù, việc chuyển đổi có thể dễ dàng phá vỡ các yêu cầu của Set. Ví dụ:

Ví dụ: bạn có Map<String, String> chứa cả hai phím "1" và "01" làm khóa. Cả hai đều khác nhau String s và do đó, Map có thể chứa cả hai khóa dưới dạng hợp pháp. Tuy nhiên, nếu bạn chuyển đổi chúng bằng cách sử dụng Long.valueOf(String), cả hai đều ánh xạ tới giá trị 1. Chúng là không còn các khóa riêng biệt nữa. Điều này sẽ không làm hỏng bất cứ điều gì nếu bạn tạo bản sao của bản đồ và thêm các mục nhập, vì bất kỳ phím nào trùng lặp sẽ ghi đè mục nhập trước đó cho khóa đó. Tuy nhiên, việc chuyển đổi một cách lười biếng Map sẽ không có cách nào để thực thi các khóa duy nhất và do đó sẽ phá vỡ hợp đồng của Map.

Điều này đúng, nhưng thực sự tôi không hiểu tại sao nó không được thực hiện vì:

  • Khi việc chuyển đổi quan trọng xảy ra, nếu 2 phím được "sáp nhập", một ngoại lệ thời gian chạy có thể là nâng lên, hoặc chúng ta có thể vượt qua một lá cờ để chỉ cho ổi thực hiện bất kỳ giá trị của các giá trị nhiều nhất có thể cho chìa khóa mới (Computed failfast/khả năng chạy failsafe)

  • chúng ta có thể có một Maps.transformKeys trong đó sản xuất một Multimap

Có một nhược điểm nào mà tôi không thấy khi làm những việc như vậy?

+0

Có vẻ phù hợp hơn với lập trình viên.stackexchange.com –

Trả lời

8

Như @CollinD đề xuất, không có cách nào để làm điều này một cách lười biếng. Để thực hiện get, bạn phải chuyển đổi tất cả các khóa bằng hàm chuyển đổi của mình (để đảm bảo mọi bản sao được phát hiện).

Vì vậy, việc áp dụng Function<K,NewK> đến Map<K,V> đã hết.

Bạn một cách an toàn có thể áp dụng Function<NewK,K> vào bản đồ:

V value = innerMap.get(fn.apply(newK)); 

Tôi không thấy một cách viết tắt ổi cho điều đó - nó có thể chỉ là không đủ hữu ích. Bạn có thể nhận được kết quả tương tự với:

Function<NewK,V> newFn = Functions.compose(Functions.forMap(map), fn); 
Các vấn đề liên quan