Collectors() i Collect().

Cześć drogi czytelniku 🙂 ! Dzisiejszy artykuł przeznaczyłam na szersze opisanie metod klasy Collectors wykorzystywanych w pracy na strumieniach danych 🙂 .

Klasa Collectors implementuje interfejs Collector i znjduje się w pakiecie java.util.stream. W samej Klasie Collectors występuje metoda collect która pozwala na utworzenie nowego typu danych na podstawie istniejących elementów strumienia. Ma to zastosowanie gdy po wykonaniu operacji wyniki chcemy otrzymać w postaci innej struktury danych niż były wcześniej np List, Set lub Map. Collectors i collect() wykorzystywane są w programowaniu funkcyjnym i operacjach na strumieniach.

Ponieważ collect jest metodą termalną to zamyka ona strumień. Bardzo często też collect i Collectors są wykorzystywane przy filtrowaniu danych. Zastosowanie tej metody zobrazuje na kilku przykładach.

Stworzyłam tablicę aut ze zduplikowanym obiektem w celu przedstawienia metody toList() oraz toSet(). Dla uproszczenia metody są typu void natomiast forEach został wywołany w celu zobrazowania wyniku.

Car[] cars = {
            new Car("red", "2005", "A1"),
            new Car("blue", "2015", "A2"),
            new Car("red", "2000", "A3"),
            new Car("red", "2000", "A3")
};

Poniżej znajduje się Collectors.toList opakowany w metodę carListColor() która przekształcalna tablicę w listę. Następnie z wykorzystaniem metody carColor() przefiltrowuje listę w celu wyodrębnienia aut tylko określonego koloru.

    public void carListColor() {
        List<Car> carList = Stream.of(cars).collect(Collectors.toList());
        carColor(carList);
    }

    private void carColor(List<Car> carList) {
        carList.stream().filter(car -> car.getColor().equalsIgnoreCase("red"))
                .forEach(System.out::println);
    }

Poniżej wynik który przedstawia auta tylko w kolorze czerwonym:

Źródło: Archiwum własne. Wynik metody carListColor().

Poniżej Collectors.toSet która przekształcalna tablicę w Set.

public void carSetColor() {
        Set<Car> carSet = Stream.of(cars).collect(Collectors.toSet());
        carSet.forEach(System.out::println);
    }

I wynik który przedstawia tylko unikatowe wartości:

Źródło: Archiwum własne. Wynik metody carSetColor().

Kolejną ciekawą metodą jest Collectors.joining() która łączy dane obiekty za pomocą wybranego łącznika np “, ” lub “-“. Metody tej należny używać wyłącznie na strumieniach z elementami typu STRING. W przeciwnym razie elementy innego typu zostaną zamienione na Stringa za pomocą metody toString().

 public void carJoiningString() {
        String collect = carList.stream()
                .map(Objects::toString)
                .collect(Collectors.joining(", "));
        System.out.println(collect);
    }

Poniżej wynik który obrazuje powyższą metodę:

Źródło: Archiwum własne. Wynik metody carJoiningString().

Natomiast metodę grupingBy() możemy użyć w celu pogrupowania elementów Mapy z wykorzystaniem strumieni. Matoda carMap() grupuje pojazdy według koloru.

    public void carMap() {     
       Map<String, List<Car>> collect = carList.stream().collect(Collectors.groupingBy(c -> c.getColor()));
        printGroupColor(collect);
    }

    private void printGroupColor(Map<String, List<Car>> collect) {
        collect.entrySet().stream()
        .forEach(x-> System.out.println(x.getKey() + " " + x.getValue()));
    }

Wynik poniżej został przedstawiony z wykorzystaniem metody entrySet() która umożliwia przejście przez mapę z wykorzystaniem strumieni i programowania funkcyjnego.

Źródło: Archiwum własne. Wynik metody carMap()

Podsumowując metody klasy Collectors znacznie ułatwiają pracę na danych oraz świetnie się sprawdzają w operacjach na strumieniach.

Jeśli uważasz powyższy tekst za pomocny, podziel się z kimś komu może być przydatny, na pewno będzie Ci wdzięczny. A tymczasem do zboczenia w kolejnym wpisie 🙂 🙂 !!

Źródła: Oracle

Leave a Comment

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *