用java8中的计数器从对象创建映射的简单方法



是否有一种使用stream((功能获得以下功能的简单方法?

HashMap<String, Integer> productMap = new HashMap<>();
Integer counter = 0;
for (Product product : products) {
for (Quality quality :  product.getQualities()) {
if (quality.evaluate() > Float.NEGATIVE_INFINITY) {
if (productMap.containsKey(quality.getName())) {
productMap.replace(quality.getName(), counter + 1);
} else {
productMap.put(quality.getName(), counter + 1);
}
}
}
}

正如其他人所指出的,counter从不递增。此外,正如@Holger所提到的,没有必要检查productMap.containsKey()。如果你真的想做同样的事情,你可以试试:

products.stream()
.flatMap(product -> product.getQualities().stream())
.filter(q -> q.evaluate() > Float.NEGATIVE_INFINITY)
.map(Quality::getName)
.forEach(qName -> productMap.put(qName, counter + 1));

首先,使用flatMap()products的流转换为qualities的流。然后过滤出那些计算值超过NEGATIVE_INFINITY的,然后将(map()(每个转换为其名称,并最终将它们放入映射中。

最新更新