2012-02-01 20 views
13

Chúng tôi hiện đang sử dụng ổi cho các bộ sưu tập bất biến của nó nhưng tôi đã ngạc nhiên khi thấy rằng bản đồ của họ không có phương pháp để dễ dàng tạo bản đồ mới với những sửa đổi nhỏ. Và trên hết, người xây dựng của họ không cho phép gán giá trị mới cho khóa hoặc xóa khóa.Hiệu chỉnh "một" một ImmutableMap

Vì vậy, nếu tôi muốn sửa đổi chỉ là một giá trị, đây là những gì tôi muốn để có thể làm:

ImmutableMap<Guid, ImmutableMap<String, Integer>> originalMap = /* get the map */; 
ImmutableMap<Guid, ImmutableMap<String, Integer>> modifiedMap = 
    originalMap.cloneAndPut(key, value); 

Đây là những gì nó trông giống như Ổi đang mong đợi tôi để làm:

ImmutableMap<Guid, ImmutableMap<String, Integer>> originalMap = /* get the map */; 
Map<Guid, ImmutableMap<String, Integer>> mutableCopy = new LinkedHashMap<>(originalMap); 
mutableCopy.put(key, value); 
originalMap = ImmutableMap.copyOf(mutableCopy); 
/* put the map back */ 

Bằng cách này, tôi nhận được một bản sao mới của bản đồ với các sửa đổi tôi muốn. Bản gốc không bị ảnh hưởng và tôi sẽ sử dụng một tham chiếu nguyên tử để đặt lại mọi thứ để toàn bộ quá trình thiết lập là an toàn chỉ.

Rất chậm.

Có rất nhiều việc sao chép lãng phí đang diễn ra dưới các trang bìa tại đây. Giả sử có 1.024 thùng trong bản đồ. Đó là 1.023 thùng mà bạn không cần thiết phải tạo ra tất cả lại (mỗi lần hai lần), khi bạn có thể đã sử dụng những xô không thay đổi đó và chỉ nhân bản một trong số chúng.

Vì vậy, tôi đoán:

  1. Có một phương pháp hữu ích Ổi chôn ở đâu đó cho các loại điều này? (Nó không có trong Bản đồ hoặc trên Bản đồ ImmutableMap.Builder.)

  2. Có thư viện Java nào khác có được loại quyền này không? Tôi có ấn tượng rằng Clojure có loại điều này dưới mui xe nhưng chúng tôi chưa sẵn sàng để chuyển đổi ngôn ngữ chỉ được nêu ra ...

+0

Vui lòng gửi yêu cầu tính năng nếu bạn thích, nhưng có thể bạn đang tìm kiếm thư viện các cấu trúc dữ liệu chức năng thích hợp. –

+0

Đúng. Đây là một điều có thể được thực hiện - đó là những gì các ngôn ngữ chức năng làm - nhưng đó không phải là những gì mà Guava có. Ổi của ổi 'ImmutableMap' dựa trên băm, và điều đó sẽ không hỗ trợ cập nhật hiệu quả, không phải không có giá đáng kể trong tốc độ truy vấn. –

+0

Cụm từ: Bộ sưu tập bất biến của ổi được xây dựng để truy vấn nhanh/lặp lại và tiêu thụ bộ nhớ tối thiểu. Điều đó có nghĩa là băm và mảng, sẽ không cho phép bạn hỗ trợ các cập nhật không phá hủy hiệu quả. –

Trả lời

6

Một chút bất ngờ các map of Functional Java là có thể thay đổi như ổi của. Danh sách là bất biến mặc dù như tôi mong đợi.

Googling cho "java bộ sưu tập liên tục" được đưa lên: pcollections. Có một số Map implementation.

Trước khi thực sự sử dụng bất kỳ triển khai nào khác, tôi sẽ đánh giá các đặc tính bộ nhớ và hiệu suất đối với Ổi. Tôi sẽ không ngạc nhiên nếu nó vẫn tốt hơn.

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