Я имею дело со следующим POJO:
@Getter
@AllArgsConstructor
public class Order {
private int quantity;
private Category category;
private LocalDate date;
//rest fields
}
У меня есть список этих объектов, и я пытаюсь найти месяц, который я хочу найти (извлечено из поля date
)и категория (которая является типом enum), которая имеет наибольшее значение quantity
.Я хочу сделать это с потоками, я сделал несколько попыток, но теперь у меня нет идей.Не могли бы вы помочь мне с этим?
Ниже моей фиктивной попытки разрешить это дело:
Optional<Entry<Month, Order>> result = orders.stream()
.collect(
Collectors.groupingBy(Order::getLocalDate, Collectors.maxBy(Comparator.comparingInt(Order::getQuantity))))
.entrySet()
.stream()
.collect(Collectors.toMap(e -> e.getKey().getMonth(), e -> e.getValue().get()))
.entrySet()
.stream()
.max(Entry.comparingByValue(Comparator.comparingInt(Order::getQuantity)));
Например, у нас есть следующий список данных:
List<Order> orders = Arrays.asList(
new Order(Category.HEADPHONES,3, LocalDate.of(2018, 2, 22)),
new Order(Category.HEADPHONES,6, LocalDate.of(2018, 2, 23)),
new Order(Category.NOTEBOOKS,8, LocalDate.of(2018, 2, 24)),
new Order(Category.NOTEBOOKS,4, LocalDate.of(2018, 3, 3)),
new Order(Category.NOTEBOOKS,1, LocalDate.of(2018, 3, 3)),
new Order(Category.PHONES,2, LocalDate.of(2018, 3,5)),
new Order(Category.PHONES,2, LocalDate.of(2018, 3,7))
);
Я хочу поиграть с потоками и получить результат (например, некоторый кортеж, содержащий month
, category
, quantity
).
В указанном выше месяце набора данных с наибольшим значением количества (9
) было February
в категории HEADPHONES
.