2015-04-01 12 views
5

Các javadoc of Spliterator (mà về cơ bản là những gì thực sự là đằng sau một Stream nếu tôi hiểu được những điều đúng) định nghĩa nhiều characeristics đó có ý nghĩa như SIZED, CONCURRENT, IMMUTABLE, vvTại sao Spliterator <?> định nghĩa NONNULL là một đặc tính?

Nhưng nó cũng định nghĩa NONNULL; tại sao?

Tôi có trách nhiệm đảm bảo điều đó và nếu, ví dụ, nhà phát triển đã cố gắng .sort() luồng không phải SORTED trong đó có các phần tử rỗng mà người đó sẽ được chào đón hợp lý bằng NPE ...

Nhưng khi đó đặc điểm này tồn tại. Tại sao? Các javadoc của Spliterator chính nó không đề cập đến bất kỳ sử dụng thực sự của nó, và không package-info.java của gói java.util.stream ...

Trả lời

3

Từ các tài liệu của Spliterator:

Một Spliterator cũng báo cáo một bộ characteristics() của cấu trúc của nó, nguồn, và các yếu tố trong số ORDERED, DISTINCT, SORTED, SIZED, NONNULL, IMMUTABLE, CONCURRENTSUBSIZED. Đây có thể được sử dụng bởi khách hàng Spliterator để kiểm soát, chuyên môn hóa hoặc đơn giản hóa tính toán.

Lưu ý rằng nó không đề cập đến việc ngăn ngừa NullPointerException s. Nếu bạn sắp xếp một Stream mà có thể chứa null giá trị nó trách nhiệm của bạn để cung cấp một Comparator mà có thể xử lý null s.

Câu thứ hai cũng làm rõ rằng việc sử dụng các cờ này chỉ là một tùy chọn, không phải là yêu cầu cho "khách hàng Spliterator", không giới hạn sử dụng bởi Stream s.


Vì vậy, bất kể nó được sử dụng bởi việc thực hiện hiện hành của Stream API, đang có khả năng để đạt được lợi thế của kiến ​​thức về một NONULL đặc trưng?

Tôi nghĩ vậy. Việc triển khai có thể phân nhánh thành mã chuyên biệt cho một số không nullSpliterator để sử dụng null để đại diện cho một số trạng thái nhất định, ví dụ: giá trị vắng mặt hoặc giá trị ban đầu trước khi xử lý phần tử đầu tiên, v.v. Nếu thực tế, mã thực thi thực tế để xử lý Stream s có thể chứa null phức tạp. Nhưng tất nhiên, bạn luôn phải cân nhắc xem việc đơn giản hóa một trường hợp có biện minh cho việc sao chép mã hay không.

Nhưng đôi khi việc đơn giản hóa đơn giản như biết rằng không có giá trị null ngụ ý rằng bạn có thể sử dụng một trong số Concurrent… Bộ sưu tập, không cho phép null s, trong nội bộ.

+0

Hmmwait ... Không phải là 'Khách hàng chủ yếu của Stream ở đây? Tôi có thể quá hẹp đầu óc nhưng tôi không thấy những khách hàng khác mà bạn có thể nghĩ ra. Chắc chắn, bạn có thể thực hiện của riêng bạn (tôi đã làm điều đó), nhưng khác hơn là sử dụng nó trong một 'Stream' ... – fge

+1

Không phải là" bạn có thể thực hiện của riêng bạn "một điểm mạnh, nếu không * điểm * của Java API, có hỗ trợ bạn bằng cách viết ứng dụng của riêng bạn thay vì cung cấp các ứng dụng hoàn chỉnh? Bên cạnh đó, 'Stream' là các máy khách chính, vâng, nhưng điều đó không bị giới hạn đối với * hiện tại * của 'Stream'. Việc thêm một đặc tính mới trong một phiên bản trong tương lai sẽ yêu cầu một bản phát hành chính, nhưng việc thêm vào việc thực hiện (sử dụng tốt hơn) cờ đã tồn tại có thể xảy ra trong mọi cập nhật nhỏ. Vì vậy, đó là một chiến lược hợp lý để thêm cờ có giá trị tiềm năng càng sớm càng tốt. – Holger

+0

Vâng, tôi đồng ý đó là một điểm mạnh; Tôi đoán tôi không đủ hiểu biết về các quyết định thiết kế đằng sau nó: / – fge

0

Tôi tìm thấy các ý kiến ​​sau đây trong mã cho enum StreamOpFlag.

// The following Spliterator characteristics are not currently used but a 
// gap in the bit set is deliberately retained to enable corresponding 
// stream flags if//when required without modification to other flag values. 
// 
// 4, 0x00000100 NONNULL(4, ... 
// 5, 0x00000400 IMMUTABLE(5, ... 
// 6, 0x00001000 CONCURRENT(6, ... 
// 7, 0x00004000 SUBSIZED(7, ... 
+0

Uh, thậm chí 'IMMUTABLE' và' CONCURRENT'? Làm thế nào là song song quyết định sau đó? Càng nhiều, tôi càng bối rối:/ – fge

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