使用Java 8流分组列表的字符串列表?

Ron*_*res 2 java collections java-8 java-stream

我有以下字符串列表

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");
Run Code Online (Sandbox Code Playgroud)

然后,我把它们放在另一个列表中

List<List<String>> products = new ArrayList<>();
products.add(product_a);
products.add(product_b);
products.add(product_c);
products.add(product_d);
Run Code Online (Sandbox Code Playgroud)

使用流,Collectors.groupingBy,Collectors.counting,我如何获得以下输出?可能吗?

Product A - 2
Product B - 1
Product C - 1
Run Code Online (Sandbox Code Playgroud)

提前谢谢你的帮助.

YCF*_*F_L 10

你的意思是 :

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()));
Run Code Online (Sandbox Code Playgroud)

输出

Product A - 2
Product B - 1
Product C - 1
Run Code Online (Sandbox Code Playgroud)

但是我想创建一个包含这三个信息的类,product category price而不是为每个项使用List.

class Product{
    private String productName;
    private String category;
    private BigDecimal price;

    //constructors getters setters
}
Run Code Online (Sandbox Code Playgroud)

然后在产品列表中填写您的产品,如下所示:

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")));
Run Code Online (Sandbox Code Playgroud)

然后你分组可以是:

Map<String, Long> group = products.stream()
        .collect(Collectors.groupingBy(Product::getProductName, Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)