1. Öğeleri toplama
Stream
Son 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 . collector
Bu 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: collector
nesnenin 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 Collectors
yeterli olacaktır.
Koleksiyonerler sınıfı
Sınıfın, Collectors
hazı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.
|
Akışı listeye dönüştüren bir nesne ( List<T> ) |
|
Bir akışı bir kümeye ( Set<T> ) dönüştüren bir nesne |
|
Akışı haritaya dönüştüren bir nesne( Map<K, V> ) |
|
Bir akışın öğelerini tek bir dizede birleştirir |
|
Bir dizenin öğelerini bir diziye dönüştürürMap<K, V> |
|
Öğ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()
. String
Bir 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(", ") );