CẬP NHẬT: Câu trả lời này là để trả lời cho câu hỏi ban đầu, Java SE 8 có Cặp hay Tuples không? (Và ngầm, nếu không, tại sao không?) OP đã cập nhật câu hỏi với một ví dụ đầy đủ hơn, nhưng có vẻ như nó có thể được giải quyết mà không cần sử dụng bất kỳ loại cấu trúc Cặp nào. [Lưu ý từ OP: đây là câu trả lời đúng khác .]
Câu trả lời ngắn gọn là không. Bạn có thể tự cuộn hoặc mang vào một trong nhiều thư viện thực hiện nó.
Có một Pair
lớp trong Java SE đã được đề xuất và từ chối ít nhất một lần. Xem chủ đề thảo luận này trên một trong các danh sách gửi thư OpenJDK. Sự đánh đổi là không rõ ràng. Một mặt, có nhiều triển khai Cặp trong các thư viện khác và trong mã ứng dụng. Điều đó thể hiện nhu cầu và việc thêm một lớp như vậy vào Java SE sẽ tăng khả năng sử dụng lại và chia sẻ. Mặt khác, việc có một lớp Cặp làm tăng thêm sự cám dỗ của việc tạo các cấu trúc dữ liệu phức tạp từ các Cặp và bộ sưu tập mà không tạo ra các kiểu và trừu tượng cần thiết. (Đó là một cách diễn đạt thông điệp của Kevin Bourillion từ chủ đề đó.)
Tôi khuyên mọi người nên đọc toàn bộ chủ đề email. Đó là sâu sắc đáng chú ý và không có flamage. Nó khá thuyết phục. Khi nó bắt đầu, tôi đã nghĩ, "Vâng, cần phải có một lớp Pair trong Java SE" nhưng đến khi chủ đề kết thúc, tôi đã thay đổi quyết định.
Tuy nhiên, xin lưu ý rằng JavaFX có lớp javafx.util.Pair . API của JavaFX được phát triển riêng biệt với API Java SE.
Như người ta có thể thấy từ câu hỏi được liên kết Tương đương với cặp C ++ trong Java là gì? có một không gian thiết kế khá lớn xung quanh một API rõ ràng đơn giản như vậy. Các đối tượng có nên bất biến? Họ có nên được tuần tự hóa? Họ có nên được so sánh? Lớp học có nên cuối cùng hay không? Hai yếu tố nên được đặt hàng? Nó nên là một giao diện hay một lớp học? Tại sao dừng lại ở cặp? Tại sao không phải là ba, bốn hoặc N-tuples?
Và tất nhiên, không thể tránh khỏi việc đặt tên cho các yếu tố:
- (a, b)
- (thứ nhất, thứ hai)
- (trái phải)
- (xe hơi, cdr)
- (foo, thanh)
- Vân vân.
Một vấn đề lớn hầu như không được đề cập là mối quan hệ của Cặp với người nguyên thủy. Nếu bạn có một (int x, int y)
mốc thời gian biểu thị một điểm trong không gian 2D, thì biểu thị điều này là Pair<Integer, Integer>
tiêu thụ ba đối tượng thay vì hai từ 32 bit. Hơn nữa, các đối tượng này phải nằm trên đống và sẽ phải chịu chi phí hoạt động.
Có vẻ như rõ ràng rằng, giống như Streams, điều cần thiết là phải có các chuyên môn nguyên thủy cho các Cặp. Chúng tôi có muốn xem:
Pair
ObjIntPair
ObjLongPair
ObjDoublePair
IntObjPair
IntIntPair
IntLongPair
IntDoublePair
LongObjPair
LongIntPair
LongLongPair
LongDoublePair
DoubleObjPair
DoubleIntPair
DoubleLongPair
DoubleDoublePair
Ngay cả một IntIntPair
vẫn sẽ yêu cầu một đối tượng trên đống.
Tất nhiên, những điều này gợi nhớ đến sự phổ biến của các giao diện chức năng trong java.util.function
gói trong Java SE 8. Nếu bạn không muốn một API cồng kềnh, bạn sẽ bỏ qua cái nào? Bạn cũng có thể lập luận rằng điều này là không đủ, và các chuyên ngành cho, Boolean
cũng nên được thêm vào.
Cảm giác của tôi là nếu Java đã thêm một lớp Pair từ lâu, thì nó sẽ đơn giản hoặc thậm chí đơn giản và nó sẽ không thỏa mãn nhiều trường hợp sử dụng mà chúng ta đang hình dung bây giờ. Hãy xem xét rằng nếu Pair đã được thêm vào trong khung thời gian JDK 1.0, thì có lẽ nó đã có thể thay đổi! (Nhìn vào java.util.Date.) Mọi người có hài lòng với điều đó không? Tôi đoán là nếu có một lớp Pair trong Java, thì nó sẽ là một loại không thực sự hữu ích và mọi người vẫn sẽ tự lăn lộn để đáp ứng nhu cầu của họ, sẽ có nhiều triển khai Pair và Tuple khác nhau trong các thư viện bên ngoài, và mọi người vẫn sẽ tranh cãi / thảo luận về cách sửa lớp Cặp của Java. Nói cách khác, loại ở cùng một nơi chúng ta ngày nay.
Trong khi đó, một số công việc đang diễn ra để giải quyết vấn đề cơ bản, đó là sự hỗ trợ tốt hơn trong JVM (và cuối cùng là ngôn ngữ Java) cho các loại giá trị . Xem tài liệu Trạng thái giá trị này . Đây là công việc sơ bộ, đầu cơ và nó chỉ bao gồm các vấn đề từ phối cảnh JVM, nhưng nó đã có một lượng lớn suy nghĩ đằng sau nó. Tất nhiên, không có gì đảm bảo rằng điều này sẽ đi vào Java 9 hoặc đã từng xuất hiện ở bất cứ đâu, nhưng nó cho thấy hướng suy nghĩ hiện tại về chủ đề này.
AbstractMap.SimpleImmutableEntry<K,V>
nhiều năm ... Nhưng dù sao, thay cho bản đồi
để(i, value[i])
chỉ cho lọc theovalue[i]
và lập bản đồ trở lạii
: tại sao không chỉ lọc theovalue[i]
ở nơi đầu tiên, mà không có bản đồ?