Java8 giới thiệu các phương pháp đó đẹp getOrDefault()
và putIfAbsent()
, cho phép viết mã như:Tôi có nên sử dụng put() hoặc putIfAbsent() sau khi sử dụng getOrDefault() không?
Map<Foo, List<Bar>> itemsByFoo = ...
List<Bar> bars = itemsByFoo.getOrDefault(key, new ArrayList<>());
bars.add(someNewBar);
Bây giờ tôi tự hỏi nếu có lý do chính đáng thực tế để một trong hai làm:
itemsByFoo.put(key, bars);
hoặc
itemsByFoo.putIfAbsent(key, bars);
Cả hai đều hoạt động:
- tùy chọn 1 có thể làm được rất nhiều không cần thiết "đặt" các cuộc gọi khi thêm các yếu tố vào danh sách xảy ra thường
- option2 có thể làm được rất nhiều "containsKey" không cần thiết gọi khi thêm mục mới cho các phím mới chiếm ưu thế
SO: là những lý do chính đáng để chọn tùy chọn 1 hoặc tùy chọn 2 "luôn"?
Ahem, * không *. Sử dụng 'itemsByFoo.computeIfAbsent (key, x -> new ArrayList <>()) .add (someNewBar);' cho toàn bộ hoạt động. – Holger
@Holger yes :) điểm tuyệt vời. Bởi vì 'putIfAbsent' có thể trả về một' null' vì nó trả về giá trị * trước * ... Ngoài ra 'computeifAbsent' hiện diện trong java-8, không phải 7. Tôi đã đối mặt với điều này trước đây ... – Eugene
@Eugene: 'putIfAbsent' được thêm vào giao diện' Bản đồ' trong Java 8, vì nó bây giờ có thể với các phương thức 'default', nhưng nó phải giữ lại hợp đồng' ConcurrentMap.putIfAbsent', tồn tại từ Java 5, vì vậy nó không thuận tiện như 'computeIfAbsent'… – Holger