2017-06-11 15 views
13

雖然在流將具有不同的特性(例如SORTED/SIZED/DISTINCT /訂購)創建的中間/ pipleline操作做流操作, - 掌握Lambda表達式(第6章)如何正確查找Java-8中的流特徵?

Stream.of(8,3,5,6,7,4)//ORDERED, SIZED 
.filer(i->i%2==0) // ORDERED 
.sorted() // ORDERED, SORTED 
.distinct() // DISTINCT, ORDERED, SORTED 
.map(i->i+1) // ORDERED 
.unordered(); //none 

我們如何找出在上面的代碼段中提到的流的不同特性?

回答

8

我想稍微延伸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)對應於SIZEDORDEREDIMMUTABLESUBSIZED

您顯示的其他人顯然也有些偏離 - 您可以自己檢查一下。

第三

這些特徵是在流處理極爲重要。舉幾個例子:

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,但是沒有;結果是​​:即使沒有太多的預防措施,也沒有這樣的優化。

+0

不,我給了整個片段。可能是我已經過時了這本書的版本。 –

+0

第三個例子(第二個片段),jdk9沒有照顧那個? –

9

在每一個階段,你可以撥打:

int c = stream.spliterator().characteristics(); 

,再試着在Spliterator類定義的常量結果。對於看到例如如果流下令:

boolean isOrdered = (c & Spliterator.ORDERED) == Spliterator.ORDERED; 

或者您可以使用:

boolean isOrdered = stream.spliterator().hasCharacteristics(Spliterator.ORDERED); 
+0

你不能這樣做*在每個階段*,流將被消耗... – Eugene

+3

@Eugene:你可以重新創建分流器的流,[見這裏](https://stackoverflow.com/a/28475289/2711488),我想,這是什麼OP後... – Holger

+2

@Holger啊!這將有意義的返回來自該分割器的流...... thx。誠摯的祝賀10萬。 – Eugene

相關問題