2017-02-24 33 views
5

Tôi tự hỏi tại sao API Bộ sưu tập Java không chứa các phương thức tiện dụng map trên các loại bộ sưu tập khác nhau. Tôi muốn viết một cái gì đó như:Tại sao bộ sưu tập Java không cung cấp phương thức bản đồ thuận tiện?

List<Foo> list = ...;  
List<String> result = list.map(Foo::toString); 

Thay vào đó tôi có để tạo ra một dòng suối, bản đồ và thu thập, như thế này:

List<Foo> list = ...; 
List<String> result = list.stream().map(Foo::toString).collect(toList()); 

Nó sẽ không được dễ dàng như việc thực hiện phương pháp mặc định này trong giao diện java.util.List? Ví dụ.

default <R> List<R> map(Function<E, R> mapper){ 
    return stream().map(mapper).collect(Collectors.toList()); 
} 

Ở lần đầu tiên, có vẻ như các phương pháp triệu tập khác đã có sẵn. Ví dụ:

list.stream().forEach(x -> {}); 

có thể được viết như

list.forEach(x -> {}); 

Tuy nhiên, so sánh không phải là tốt. Iteratable.forEach là một phương thức mặc định trên giao diện cấp cao nhất và không cần chỉ định kiểu trả về. Nó không tạo ra một dòng dưới mui xe, mà là sử dụng các thuộc tính Iteratables để ... cũng ... lặp lại tất cả các phần tử.

Vì vậy, câu hỏi vẫn còn: Tại sao không có phương thức bản đồ trên mỗi giao diện API bộ sưu tập? Có lẽ vì nó không đủ linh hoạt bởi vì bạn sẽ cần quyết định loại trả lại?

Tôi chắc chắn những người triển khai đã nghĩ về điều đó và có lý do để không đưa nó vào. Và tôi muốn hiểu tại sao.

+0

Chỉ bốn ngày trước đó: [“Tại sao' Danh sách' không có phương thức mặc định 'map' khi nó có' forEach'? ”] (http://stackoverflow.com/q/42364761/2711488) – Holger

Trả lời

6

Có, điều này là có chủ ý. Một số lý do tôi đã nghe thảo luận:

  • nhiều lần, những phương pháp này đang xích lại với nhau, trong trường hợp này đó là hiệu quả hơn để chỉ thu thập vào một cấu trúc dữ liệu rõ ràng ở phần cuối của việc tính toán
  • kiểm soát kích thước tuyệt đối của giao diện; quản lý số lượng tùy chọn xuất hiện trong autocomplete
  • mâu thuẫn tránh với hiện thực bên ngoài của Collection rằng đã cung cấp phương pháp đặt tên map vv
  • xây dựng tất cả các tính năng thông thạo thành một API chặt chẽ với các phương pháp cấu hình chuyên như parallel(); và API đó giờ đây có thể được phát triển riêng biệt với các bộ sưu tập được xây dựng trên
  • như bạn đã đề cập, cho phép người dùng quyết định rõ ràng về việc triển khai loại trả về - nếu bạn có một tùy chọn Collection và gọi là map trên đó, là một List, hoặc một Set âm thầm khử trùng đầu ra của nó ?! điều đó sẽ gây nhầm lẫn với số điện thoại
Các vấn đề liên quan