Статьи

Предварительный просмотр API Java Streams

В сегодняшнем посте я хочу поделиться серией примеров, которые я разработал, пробуя последние функции Java 8 Stream API. В моем последнем посте я сравнил функции с доступными в LINQ, и для сегодняшнего поста я решил пойти немного дальше и попытаться использовать API для работы с моделью небольшого домена. Приведенные здесь примеры основаны на тех же примерах, которые представлены в проекте LambdaJ .

Модель данных

Для примеров я буду использовать следующую модель предметной области:

лямбда-модель

Вы можете увидеть полную реализацию всех примеров, разработанных здесь, загрузив следующий Gist .

Для примеров, представленных ниже, предположим, что в контексте кода всегда доступны три потока:

  • Stream<Person> persons,
  • Stream<Car> cars,
  • Stream<Sale> sales,

Задача 1: Распечатать все автомобильные бренды

Из коллекции автомобилей печатаются все марки автомобилей.

StringJoiner brands = cars.map(Car::getBrand)
.collect(toStringJoiner(","));
String allBrands = brands.toString();

Для этого примера я также использовал новый StringJoinerкласс.

Задача 2: Выбрать все продажи на Toyota

Из коллекции продаж выберите все, что связано с автомобилями Toyota.

List<Sale> toyotaSales;
toyotaSales = sales.filter(s -> s.getCar().getBrand().equals("Toyota"))
.collect(toList());
toyotaSales.forEach(System.out::println);

В этом примере я мог бы также использовать forEachметод в потоке, чтобы распечатать все продажи. Я сделал это таким образом, чтобы проиллюстрировать, что можно собрать все элементы в потоке в список и оттуда мы можем их обработать. Но в идеале я должен был обработать элементы прямо в потоке.

Задача 3: Найти покупки самого молодого человека

Из коллекции продаж найдите все те, которые принадлежат самому молодому покупателю.

ToIntFunction<Entry<Person, List<Sale>>> byAge;
byAge = e -> e.getKey().getAge();
byYoungest = sales.collect(groupingBy(Sale::getBuyer))
.entrySet()
.stream()
.sorted(comparing(byAge))
.map(Entry::getValue)
.findFirst();
if(byYoungest.isPresent()) {
System.out.println(byYoungest.get());
}

Задача 4: Найти самую дорогую продажу

Из коллекции продаж найдите самые дорогие из всех.

Optional<Sale> mostCostlySale;
Comparator<Sale> byCost = comparing((ToDoubleFunction<Sale>)Sale::getCost)
.reverseOrder();
mostCostlySale = sales.sorted( byCost )
.findFirst();
if(mostCostlySale.isPresent()) {
System.out.println(mostCostlySale.get());
}

Задача 5: Сумма продаж от мужчин-покупателей и продавцов

Из коллекции продаж найдите сумму всех покупок / продаж, сделанных мужчинами.

doublesum = sales.filter(s -> s.getBuyer().isMale()
&& s.getSeller().isMale())
.mapToDouble(Sale::getCost)
.sum();

Задача 6: Найти возраст самого молодого покупателя

Из коллекции продаж найдите возраст самого молодого покупателя, который купил более 40 000.

OptionalInt ageOfYoungest;
ageOfYoungest = sales.filter(sale -> sale.getCost() > 40000)
.map(Sale::getBuyer)
.mapToInt(Person::getAge)
.sorted()
.findFirst();
if(ageOfYoungest.isPresent()) {
System.out.println(ageOfYoungest.getAsInt());
}

Задача 7: Сортировка продаж по стоимости

Сортировать коллекцию продаж по стоимости.

Comparator<Sale> byCost= comparing((ToDoubleFunction<Sale>) Sale::getCost);
List<Sale> sortedByCost;
sortedByCost = sales.sorted( byCost )
.collect(toList());

Задача 8: Индекс автомобилей по марке

Из коллекции автомобилей, индекс автомобилей по марке.

Map<String,List<Car>> byBrand;
byBrand = cars.collect( groupingBy(Car::getBrand ));

Задача 9: найти самый покупаемый автомобиль

Из коллекции продаж найдите самый покупаемый автомобиль.

ToIntFunction<Entry<Car,List<Sale>>> toSize = (e -> e.getValue().size());
Optional<Car> mostBought;
mostBought = sales.collect( groupingBy(Sale::getCar) )
.entrySet()
.stream()
.sorted( comparing(toSize).reverseOrder() )
.map(Entry::getKey)
.findFirst();
if(mostBought.isPresent()) {
System.out.println(mostBought.get());
}

Похожие сообщения

Дальнейшее чтение