1. Öğeleri toplama

StreamSon olarak sınıfın en ilginç metoduna, metoda geldik collect(). Akışlardan tanıdık koleksiyonlarımıza - List<T>, Set<T>, Map<T, R>ve diğerlerine geçmek için kullanılır.

Yöntem , bağımsız değişken olarak collect()özel bir nesne alır . collectorBu nesne, akıştaki tüm verileri okur, onu belirli bir koleksiyon türüne dönüştürür ve döndürür. Ve sonra toplama yönteminin kendisi bu koleksiyonu döndürür.

Bütün bunlar oldukça şık bir şekilde yapılır: collectornesnenin tipi Collector<T, A, R>. Gördüğünüz gibi, üç tip parametresi var. Son tür parametresi ( R) genellikle şuna benzer bir türdür List<T>: Bu, derleyicinin, yöntemin kendisi için doğru dönüş türünü belirlemek için bu türü kullanabileceği anlamına gelir collect().

Umarım kafan çok karışık değildir. Her durumda, Collector nesnelerini kendiniz oluşturmanız gerekmez. Sınıfın static metodları ile döndürülen hazır objeler Collectorsyeterli olacaktır.

Koleksiyonerler sınıfı

Sınıfın, Collectorshazır toplayıcı nesneleri döndüren birkaç statik yöntemi vardır - her durum için bir şey. Burada en önemlilerini ele alacağız.

toList()
Akışı listeye dönüştüren bir nesne ( List<T>)
toSet()
Bir akışı bir kümeye ( Set<T>) dönüştüren bir nesne
toMap()
Akışı haritaya dönüştüren bir nesne( Map<K, V>)
joining()
Bir akışın öğelerini tek bir dizede birleştirir
mapping()
Bir dizenin öğelerini bir diziye dönüştürürMap<K, V>
groupingBy()
Öğeleri gruplandırır ve döndürürMap<K, V>

2. Bir akışı bir listeye dönüştürme

Aşağıda, bir akışla çalışmanın ve sonucu bir listeye dönüştürmenin tipik bir örneği verilmiştir.

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");

List<String> result = list.stream()
   .filter( s -> Character.isUpperCase(s.charAt(0)) )
   .collect( Collectors.toList() );

Koleksiyondan bir akış aldık. Ardından, yalnızca ilk karakteri büyük olan dizeleri tutarak yeni bir akış elde ettik. Ardından, bu akıştan gelen tüm veriler, daha sonra döndürülen bir koleksiyonda toplanır.



3. Bir akışı bir kümeye dönüştürme

Aşağıda, bir akışla çalışmanın ve sonucu bir kümeye dönüştürmenin tipik bir örneği verilmiştir.

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");

Set<String> result = list.stream()
   .filter( s -> Character.isUpperCase(s.charAt(0)) )
   .collect( Collectors.toSet() );

Her şey, bir akışı a'ya dönüştürmek için kullanılan koda çok benzer List, yalnızca yöntem tarafından döndürülen farklı bir toplayıcı nesne kullanıyoruz toSet().



4. Akışı haritaya dönüştürme

Ancak bir akışı haritaya dönüştürmek biraz daha zordur. Bir Haritadaki her giriş iki öğeden oluşur: bir anahtar ve bir değer. Akıştaki her bir öğe için anahtarı ve değeri nasıl tanımlayacağımızı bulmamız gerekiyor.

Örnek:

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");

Map<String, String> result = list.stream()
   .map( e -> e.split("=") )
   .filter( e -> e.length == 2 )
   .collect( Collectors.toMap(e -> e[0], e -> e[1]) );

Burada neler olup bittiğine bir göz atalım.

İlk satırda, map(...)her bir diziyi bir dizi diziye dönüştürmek için kullanıyoruz. Bölme yöntemini kullanarak, her bir diziyi iki parçaya böleriz.

filter()İkinci satırda, yönteme yalnızca tam olarak iki öğe içeren dizileri iletiyoruz . Dize d==3, filtreyle eşleşmeyen üç öğelik bir diziye bölünür.

Ve son olarak, son satırda, akışı bir Map<String, String>. Yönteme iki işlev iletilir toMap(). Akışın her öğesi için, birinci işlev anahtarı döndürmeli ve ikincisi değeri döndürmelidir .

Her dizinin ilk elemanı ("a", "b", "c") anahtarımız olacak ve her dizinin ikinci elemanı ("2", "3", "4") değerimiz olacaktır.



5. Bir akışı bir diziye dönüştürme

Başka bir ilginç toplayıcı nesnesi tarafından döndürülür Collectors.joining(). StringBir akışın tüm öğelerini tek bir dizeye dönüştürür ve bunları birleştirir. Örnek

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");
String result = list.stream().collect( Collectors.joining(", ") );