【发布时间】:2014-09-22 12:44:24
【问题描述】:
我有一张格式的地图
Map<String, List<TableDTO>>
public class TableDTO {
private String countryName;
private String sourceName;
private int year;
private Double usageValue;
private Double powerUsers;
//Setter & Getters
}
我想找到usageValues 和powerUsers 的平均值,并且仍然保持TableDTO 结构,并且usageValue 可以为null,如果它为null,则完全忽略该对象。
<Chrome, <UK, Lorem, 2013, 2.90, 5.4>>
<Chrome, <US, Lorem, 2013, 4.10, 1.5>>
<Chrome, <EU, Lorem, 2013, 1.20, 0.22>>
<Chrome, <Asia, Lorem, 2013, 3.90, -1.10>>
<IE, <UK, Lorem, 2013, 1.40, 24.4>>
<IE, <US, Lorem, 2013, 0.90, 14.4>>
<IE, <EU, Lorem, 2013, 2.10, 0>>
<IE, <Asia, Lorem, 2013, 0.90, 0.4>>
<FF, <UK, Lorem, 2013, 0.10, 2.14>>
<FF, <US, Lorem, 2013, 1.10, 4.0>>
<FF, <EU, Lorem, 2013, , 4.4>>
<FF, <Asia, Lorem, 2013, 2.90, 4.4>>
预期结果
<1, <UK, Lorem, 2013, 1.47, 10.65>>
<2, <US, Lorem, 2013, 2.03, 6.63>>
<3, <Asia, Lorem, 2013, 2.57, 1.23>>
现在在结果中,我已经用索引替换了键,这目前很好。您会注意到,由于欧盟的 FF 具有空值,因此整个欧盟已被忽略,但对于其余部分,我计算了平均值。
如何在 Java 8 中使用 Lambda 表达式来做到这一点,还是我必须遍历?
更新 1: 这是我目前所得到的:
1.
Map<String, List<TableDTO>> dump = mapOfAllData.values()
.stream()
.flatMap(list -> list.stream())
.collect(Collectors.groupingBy(TableDTO::getCountryName));
Which give me a map with country names and the DTO orderd
2.
dump.values().stream().flatMap(list -> list.stream())
.filter((o -> !o.getUsageValue().isEmpty()))
.collect(Collectors.mapping(TableDTO::getUsageValue, Collectors.averagingDouble(Double::parseDouble)));
基本上得到平均值,但不会删除usageValue为空的DTO,我目前正在尝试解决。
更新 2:
我设法从我的地图中删除了不需要的国家。
我想弄清楚如何求两个元素的平均值,我有这个表达式
newMap.values().stream().flatMap(list -> list.stream())
.collect(Collectors.mapping(TableDTO::usageValue, Collectors.averagingDouble(s -> s.isEmpty() ? Double.NaN : Double.parseDouble(s))));
// Collectors.mapping(TableDTO::powerUsers, Collectors.averagingDouble(c -> c.isEmpty() ? Double.NaN : Double.parseDouble(c))));
但我无法获得 powerUsers 的平均值。
【问题讨论】:
-
这与您之前的问题类似 - 如果您显示您拥有的代码以及哪些代码不起作用,会更容易。
-
@assylias,老实说,我还没有解决这个问题,我的问题是我没有任何导师帮助我学习 Java,所以我更多地依赖论坛和 Javadocs
-
@victor:特别是如果你想学习,你应该先尝试自己解决问题。在这里问几乎相同的问题表明学习并不成功,并建议您应该质疑您的学习方法。
-
谢谢大家的支持,我明白你的意思了,给我一些时间,我会发布更新。
-
什么是
getNewIndex()?
标签: java map lambda average java-8