【发布时间】:2017-10-20 17:08:12
【问题描述】:
我知道论坛中有人问过类似的问题,但似乎都没有完全解决我的问题。现在我对 Java 8 很陌生,所以请多多包涵。 我有一个产品列表,例如:
Input:
name category type cost
prod1 cat2 t1 100.23
prod2 cat1 t2 50.23
prod1 cat1 t3 200.23
prod3 cat2 t1 150.23
prod1 cat2 t1 100.23
Output:
Single line (name, category, type) summing the cost and count of products.
Product {
public String name;
public String category;
public String type;
public int id;
public double cost;
}
我需要按名称、类别和类型对其进行分组,并生成一个结果 汇总这些数据并生成每个产品的总成本和数量。大多数示例显示按两个字段分组并使用单个条件进行聚合。
根据论坛上的建议,我想出了这个分组:
public class ObjectKeys {
ArrayList<Object> keys;
public ObjectKeys(Object...searchKeys) {
keys = new ArrayList<Object>();
for (int i = 0; i < searchKeys.length; i++) {
keys.add( searchKeys[i] );
}
}
}
然后使用如下:
Map<String, Map<String, Map<String, List<Product>>>> productsByNameCategoryType =
products.stream().collect(groupingBy(new ObjectKeys(l.name(), l.category(),l.type())))
但是我如何将上面的代码链接起来计数和求和?特别是对于超过 2 个字段的分组。 有一个更好的方法吗?
就像我提到的我的 Java8 不是那么好,请帮助。
【问题讨论】:
-
也许你需要一个
Item类型来保存Product和cost。然后你就可以轻松完成你的工作了。 -
@holi-java 你介意为我扩展一下你的想法
-
对不起,我正在接电话。如果您引入
Item类并从Priduct中删除cost,您可以按产品对项目进行汇总。
标签: lambda java-8 java-stream chaining collectors