我想稍微延伸assylias說了什麼(這是絕對正確的)。
第一個,這些特徵實現爲普通int
,它是二進制表示。首先它都是零,但是當您添加某個特徵時,它的位通過OR
操作設置爲one
,通過AND
操作刪除。
你能看到一定的Spliterator財產這樣做,例如將其one
簡單:
System.out.println(Integer.toBinaryString(Spliterator.SIZED)); // 1000000
它設置了7個位爲一個從右邊。所以,當你檢查:
Spliterator<Integer> spliterator = Stream.of(8, 3, 5, 6, 7, 4).spliterator();
System.out.println((spliterator.characteristics() & Spliterator.SIZED) == Spliterator.SIZED);
如果這特別位設置你實際上檢查。
二
有被設置爲你的第一個流創建(而不是二)的結果流特性。無論是這本書有點過時,或者你沒有向我們展示了整個示例:
Spliterator<Integer> spliterator = Stream.of(8, 3, 5, 6, 7, 4).spliterator();
System.out.println(Integer.bitCount(spliterator.characteristics())); // 4
System.out.println(Integer.toBinaryString(spliterator.characteristics()));// 100010001010000
這些設置位(即等於one
)對應於SIZED
,ORDERED
,IMMUTABLE
,SUBSIZED
。
您顯示的其他人顯然也有些偏離 - 您可以自己檢查一下。
第三
這些特徵是在流處理極爲重要。舉幾個例子:
long howMany = Stream.of(1, 2, 3).map(x -> {
System.out.println("mapping");
return x * 2;
}).count();
System.out.println(howMany); // 3
在java中-9就不會看到的mapping
印刷,因爲你沒有改變流(你沒有清理SIZED
特性);因此根本不需要甚至評估映射。
Stream<Integer> unlimited = Stream.iterate(0, x -> x + 1);
System.out.println(unlimited.spliterator().hasCharacteristics(Spliterator.SIZED));
Stream<Integer> limited = unlimited.limit(3);
System.out.println(limited.spliterator().hasCharacteristics(Spliterator.SIZED));
你會認爲輸出應該是false true
- 我們增加畢竟是limit
,但是沒有;結果是:即使沒有太多的預防措施,也沒有這樣的優化。
不,我給了整個片段。可能是我已經過時了這本書的版本。 –
第三個例子(第二個片段),jdk9沒有照顧那個? –