getAverage(): возвращает среднее значение
getCount(): возвращает количество элементов в наборе
getMax(): возвращает максимальное значение
getMin(): возвращает минимальное значение
getSum(): возвращает сумму элементов
accept(): добавляет в набор новый элемент
В данном случае мы получаем среднюю цену смартфонов для каждой группы.
Метод mapping
Метод mapping позволяет дополнительно обработать данные и задать функцию отображения
объектов из потока на какой-нибудь другой тип данных. Например:
Map> phonesByCompany = phoneStream.collect(
Collectors.groupingBy(Phone::getCompany,
Collectors.mapping(Phone::getName, Collectors.toList())));
for(Map.Entry> item : phonesByCompany.entrySet()){
System.out.println(item.getKey());
for(String name : item.getValue()){
System.out.println(name);
}
}
Выражение Collectors.mapping(Phone::getName, Collectors.toList()) указывает, что в группу
будут выделятся названия смартфонов, причем группа будет представлять объект List.
Сортировка
Коллекции, на основе которых нередко создаются потоки, уже имеют специальные методы
для сортировки содержимого. Однако класс Stream также включает возможность сортировки.
Такую сортировку мы можем задействовать, когда у нас идет набор промежуточных операций с
потоком, которые создают новые наборы данных, и нам надо эти наборы отсортировать.
Для простой сортировки по возрастанию применяется метод sorted():
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class StreamApp {
public static void main(String[] args) {
List phones = new ArrayList();
phones.addAll(Arrays.asList(new String[]
{"iPhone 6 S", "Lumia 950", "Huawei Nexus 6P",
"Samsung Galaxy S 6", "LG G 4", "Xiaomi MI 5",
"ASUS Zenfone 2", "Sony Xperia Z5", "Meizu Pro 5",
"Lenovo S 850"}));
phones.stream()
.filter(p->p.length()<12)
.sorted() // сортировка по возрастанию
.forEach(s->System.out.println(s));
}
}
Консольный вывод после сортировки объектов:
LG G 4
Lumia 950
Meizu Pro 5
Xiaomi MI 5
iPhone 6 S
Однако данный метод не всегда подходит. Уже по консольному выводу мы видим, что метод
сортирует объекты по возрастанию, но при этом заглавные и строчные буквы рассматриваются
отдельно.
Кроме того, данный метод подходит только для сортировки тех объектов, которые реализуют
интерфейс Comparable.
Если же у нас классы объектов не реализуют этот интерфейс или мы хотим создать какую-то
свою логику сортировки, то мы можем использовать другую версию метода sorted(), которая в
качестве параметра принимает компаратор.
Например, пусть у нас есть следующий класс 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;
}
}
Отсортируем поток обектов Phone:
import java.util.Comparator;
import java.util.stream.Stream;
public class StreamApp {
public static void main(String[] args) {
Stream
phoneStream = Stream.of(new Phone("iPhone 6 S", "Apple",
600),
new Phone("Lumia 950", "Microsoft", 500),
new Phone("LG G 5", "LG",450),
new Phone("ASUS Zenfone 2", "ASUS",150),
new Phone("Lumia 640", "Microsoft", 200));
phoneStream.sorted(new PhoneComparator())
.forEach(p->System.out.printf("%s (%s) - %d \n",
p.getName(), p.getCompany(), p.getPrice()));
}
}
class PhoneComparator implements Comparator
{
public int compare(Phone a, Phone b){
return a.getName().toUpperCase().compareTo(b.getName().toUpperCase());
}
}
Здесь определен класс компаратора PhoneComparator, который сортирует объекты по полю
name. В итоге мы получим следующий вывод:
ASUS Zenfone 2 (ASUS) - 150
iPhone 6 S (Apple) - 600
LG G 5 (LG) - 450
Lumia 640 (Microsoft) - 200
Lumia 950 (Microsoft) - 500
Do'stlaringiz bilan baham: |