2017-06-11 27 views
13

- Mastering Lambdas (Ch 6) yapmak nasılJava-8'deki akış özelliklerini nasıl doğru bir şekilde bulabilirsiniz? akışları farklı özelliklere (örn SORTED/ÖLÇEKLİ/DıSTıNCT/SİPARİŞ) ile oluşturulan olacağını ara/pipleline işlemleri sırasında dere işlemleri, yaparken

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 

öğreneceğiz Yukarıdaki snippet'te belirtildiği gibi akışın farklı özellikleri?

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

Sonra Spliterator sınıfında tanımlanan sabitler karşı sonucu test: Her At

cevap

8

Biraz assylias (kesinlikle doğru olan) söylediklerini uzatmak istiyoruz. Bu özellikler, int no'lu düzlem olarak uygulanmıştır, ikili gösterimdir.

İlk. Öncelikle hepsi sıfırdır, ancak belirli bir özelliği eklediğinizde, bitişlemi ile ayarlanmış, AND işlemi ile kaldırılmıştır. Bu sağdan birine 7-inci bit ayarlıyor

System.out.println(Integer.toBinaryString(Spliterator.SIZED)); // 1000000 

: Belli Spliterator mülkiyet örneğin yaparak sadece kendi one battığı yere

görebilirsiniz. Yani kontrol ederken: Bu özellikle bit ayarlanırsa Aslında kontrol ediyoruz

Spliterator<Integer> spliterator = Stream.of(8, 3, 5, 6, 7, 4).spliterator(); 
System.out.println((spliterator.characteristics() & Spliterator.SIZED) == Spliterator.SIZED); 

.

İkinci

ilk akışı yaratma (ve iki) sonucunda belirlenir akışı özellikleri vardır. Ya kitap biraz modası geçmiş ya da bize tüm örnek gösterdi koymadık:

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 eşittir) Bu set bit SIZED, ORDERED, IMMUTABLE, SUBSIZED karşılık gelmektedir.

Göstermiş olduğunuz diğer şeyler de biraz açık - kendiniz de kontrol edebilirsiniz.

Üçüncü

Bu özellikler akışı işlemede son derece önemlidir.Birkaç örnek: Java-9

long howMany = Stream.of(1, 2, 3).map(x -> { 
     System.out.println("mapping"); 
     return x * 2; 
    }).count(); 
    System.out.println(howMany); // 3 

akışta (eğer SIZED karakteristik temizlenmiş değil) değişmemiştir çünkü, mapping baskılı görmez; bu nedenle haritalamayı hiç değerlendirmeye bile gerek yok.

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)); 

Çıktı false true olması gerektiğini düşünürdüm - bir sonuçta limit, ancak hiçbir ekliyoruz; Sonuç false false: çok fazla önleme olmasa bile böyle bir optimizasyon yapılmaz.

+0

Hayır, tüm parçacığı verdim. Kitabın eski sürümüne sahip olabilir miyim. –

+0

Üçüncü örnek (ikinci snippet), jdk9 bununla ilgilenmiyor mu? –

9

Arayabileceğin sahneye. dere konumunda iken eğer örnek görmeleri için:

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

Alternatif kullanabilirsiniz:

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

bunu yapamazsınız * her aşamada *, akış tüketilir ... – Eugene

+3

@Eugene: spliterator'dan akışı yeniden oluşturabilirsiniz, [https://stackoverflow.com/a/28475289/2711488), sanırım, OP'in peşinde olduğu şey bu… – Holger

+2

@Holger ah! Bu spliterator'dan bir akış döndürmek anlamlıdır ... thx. samimi tebrikler 100k. – Eugene