2015-04-01 37 views
5

javadoc of Spliterator(這基本上是什麼是真的Stream如果我理解正確的事情背後)定義了許多習性研究其意義如SIZEDCONCURRENTIMMUTABLE爲什麼Spliterator <?>非空定義爲特點呢?

但它也定義NONNULL;爲什麼?

我會盡力確保用戶的責任,並且如果開發人員試圖在.sort()SORTED流中存在空元素,他/她會被NPE正確地迎接...

但隨後這一特徵的存在。爲什麼?的Spliterator本身的Javadoc沒有提到它的任何實際使用,而且也不該java.util.stream包的package-info.java ...

回答

3

Spliterator文檔:

甲Spliterator還報告一組其結構,源極,和元素的characteristics()ORDERED中,DISTINCTSORTEDSIZEDNONNULLIMMUTABLECONCURRENT ,和SUBSIZED。 Spliterator客戶可以使用這些控制,專門化或簡化計算。

注意其提預防NullPointerException秒。如果您對Stream進行排序,其中可能包含null值,那麼您有責任提供Comparator,它可以處理null s。

第二句還明確指出,使用這些標誌只是一個選項,不是「Spliterator客戶端」的要求,不限於Stream s的使用。


所以不管它是否使用由目前執行的Stream API的,是有可能獲得約NONULL特色優勢的知識呢?

我是這麼認爲的。一個實現可以分支到用於非nullSpliterator一個專門的代碼以利用null用於表示某個狀態然後,例如缺席值或處理所述第一元件,等等。如果事實,用於處理Stream S上的實際實施方式的代碼,其可含有null複雜前的初始值。但是,當然,您必須權衡一個案例的簡化是否證明代碼重複。

但有時簡化是明知沒有null值簡單意味着您可以使用Concurrent…集合,它不允許null S,內部之一。

+0

Hmmwait ...不是'Stream's在這裏的主要客戶?我可能太狹隘了,但我沒有看到你可能設計的其他客戶。當然,你可以實現你自己的(我做到了這一點),但除了在'Stream'中使用它... ... – fge 2015-04-02 09:28:11

+1

是不是「你可以實現你自己」的一個優點,如果不是* Java的*點API,它可以幫助您編寫自己的應用程序,而不是提供完整的應用程序?除此之外,'Stream's是主要客戶,是的,但不限於'Stream'的*當前實現*。在未來的版本中添加一個新特性需要一個主要版本,但添加一個實現(更好地)使用已經存在的標誌可能會在每次小小的更新中發生。因此,儘早添加具有潛在價值的標誌是一個合理的策略。 – Holger 2015-04-02 09:42:10

+0

是的,我同意這是一個強項;我想我對其背後的設計決策缺乏足夠的瞭解:/ – fge 2015-04-02 11:41:19

0

我發現的代碼如下評論爲枚舉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

呃,連'IMMUTABLE'和'CONCURRENT'?那麼並行化是如何決定的?越多,我越困惑:/ – fge 2015-04-02 04:49:09

相關問題