Использование Java 8 потоков groupingBy в списке списка строк?
У меня есть следующий список строк
List<String> product_a= Arrays.asList("Product A", "Category A", "Price");
List<String> product_b= Arrays.asList("Product A", "Category A", "Price");
List<String> product_c= Arrays.asList("Product B", "Category B", "Price");
List<String> product_d = Arrays.asList("Product C", "Category C", "Price");
Затем я положил их в другой список
List<List<String>> products = new ArrayList<>();
products.add(product_a);
products.add(product_b);
products.add(product_c);
products.add(product_d);
Используя потоки, Collectors.groupingBy, Collectors.counting, как я могу получить следующий вывод? Является ли это возможным?
Product A - 2
Product B - 1
Product C - 1
Заранее спасибо за помощь.
1 ответ
Решение
Ты имеешь в виду:
Map<String, Long> group = products.stream()
.collect(Collectors.groupingBy(c -> c.get(0), Collectors.counting()));
group.entrySet().forEach(c -> System.out.println(c.getKey() + " - " + c.getValue()));
Выходы
Product A - 2
Product B - 1
Product C - 1
Но я хотел бы создать класс, который содержит эти три информации product
category
price
вместо использования списка для каждого элемента.
class Product{
private String productName;
private String category;
private BigDecimal price;
//constructors getters setters
}
Затем заполните ваши продукты в списке продуктов следующим образом:
List<Product> products = new ArrayList<>();
products.add(new Product("Product A", "Category A", new BigDecimal("123")));
products.add(new Product("Product A", "Category A", new BigDecimal("456")));
products.add(new Product("Product B", "Category B", new BigDecimal("696")));
products.add(new Product("Product C", "Category C", new BigDecimal("66")));
Тогда у вас группировка может быть:
Map<String, Long> group = products.stream()
.collect(Collectors.groupingBy(Product::getProductName, Collectors.counting()));