Sortare
Colecțiile, pe baza cărora deseori sunt create fluxuri, au deja metode speciale pentru sortarea conținutului. Totuși, clasa Stream include și ea posibilitatea de sortare. Această sortare poate fi utilizată atunci când avem un set de operații intermediare asupra fluxului, care creează noi seturi de date, și avem nevoie să sortăm aceste seturi.
Pentru sortarea simplă în ordine crescătoare se folosește metoda sorted():
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Program {
public static void main(String[] args) {
List<String> phones = new ArrayList<String>();
Collections.addAll(phones, "iPhone X", "Nokia 9", "Huawei Nexus 6P",
"Samsung Galaxy S8", "LG G6", "Xiaomi MI6",
"ASUS Zenfone 3", "Sony Xperia Z5", "Meizu Pro 6",
"Pixel 2");
phones.stream()
.filter(p -> p.length() < 12)
.sorted() // sortare în ordine crescătoare
.forEach(s -> System.out.println(s));
}
}
Rezultatul afișat în consolă după sortarea obiectelor:
LG G6
Meizu Pro 6
Nokia 9
Pixel 2
Xiaomi MI6
iPhone X
Totuși, această metodă nu este întotdeauna potrivită. După cum se poate observa din rezultatul afișat, metoda sortează obiectele în ordine crescătoare, dar tratează literele mari și mici separat.
În plus, această metodă este potrivită doar pentru sortarea obiectelor care implementează interfața Comparable.
Dacă clasele obiectelor noastre nu implementează această interfață sau dorim să creăm o logică de sortare proprie, putem folosi cealaltă versiune a metodei sorted(), care acceptă un comparator ca parametru.
De exemplu, să presupunem că avem următoarea clasă Phone:
class Phone {
private String name;
private String company;
private int price;
public Phone(String name, String comp, int price) {
this.name = name;
this.company = comp;
this.price = price;
}
public String getName() { return name; }
public int getPrice() { return price; }
public String getCompany() { return company; }
}
Să sortăm fluxul de obiecte Phone:
import java.util.Comparator;
import java.util.stream.Stream;
public class Program {
public static void main(String[] args) {
Stream<Phone> phoneStream = Stream.of(new Phone("iPhone X", "Apple", 600),
new Phone("Pixel 2", "Google", 500),
new Phone("iPhone 8", "Apple", 450),
new Phone("Nokia 9", "HMD Global", 150),
new Phone("Galaxy S9", "Samsung", 300));
phoneStream.sorted(new PhoneComparator())
.forEach(p -> System.out.printf("%s (%s) - %d \n",
p.getName(), p.getCompany(), p.getPrice()));
}
}
class PhoneComparator implements Comparator<Phone> {
public int compare(Phone a, Phone b) {
return a.getName().toUpperCase().compareTo(b.getName().toUpperCase());
}
}
Aici este definită clasa comparator PhoneComparator, care sortează obiectele după câmpul name. Rezultatul va fi:
Galaxy S9 (Samsung) - 300
iPhone 8 (Apple) - 450
iPhone X (Apple) - 600
Nokia 9 (HMD Global) - 150
Pixel 2 (Google) - 500