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:
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:
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ę:
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.
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