API-интерфейс для сборщиков java достаточно мощный, и для его решения есть множество полезных утилит.
public class Learn {
static class Product {
final Integer productNumber;
final Integer locationNumber;
Product(Integer productNumber, Integer locationNumber) {
this.productNumber = productNumber;
this.locationNumber = locationNumber;
}
Integer getProductNumber() {
return productNumber;
}
Integer getLocationNumber() {
return locationNumber;
}
}
public static Product of(int i, int j){
return new Product(i,j);
}
public static void main(String[] args) {
List productList = Arrays.asList(of(1,1),of(2,1),of(3,1),
of(7,2),of(8,2),of(9,2));
Map> results = productList.stream().collect(Collectors.groupingBy(Product::getLocationNumber,
Collectors.collectingAndThen(Collectors.toList(), pl->pl.stream().map(Product::getProductNumber).collect(Collectors.toList()))));
System.out.println(results);
}
}
Итак, что мы делаем здесь, так это то, что мы транслируем список продуктов и группируем поток по атрибуту местоположения, но с учетом того, что мы хотим преобразовать собранный список продуктов в список номеров продуктов.
Collectors.collectingAndThen - это именно тот метод для этого, который позволит вам указать главный коллектор toList () и функцию преобразователя, которая является ничем иным как потоком для сопоставления товара с номерами товара. В java API doc основной коллектор и трансформатор помечены как нисходящий коллектор и финишер.
Пожалуйста, ознакомьтесь с исходным кодом Collectors, чтобы получить полное представление о том, как определены все эти различные сборщики.