我学习Java 8 Lambda Expressions和 stream API .为了理解,我尝试对 SQL 查询进行表达式模拟:
select department, avg(salary) from employee group by department
对于:
private static class Employee {
public String name;
public String department;
public int salary;
}
官方教程中的解决方案:
empls.stream().collect(
Collectors.groupingBy(
x -> x.department,
Collectors.averagingInt(x -> x.salary)))
在我找到这个解决方案之前,我的策略是通过分组计算平均值:
Map<String, List<Employee>> tmp =
empls.stream().collect(Collectors.groupingBy(x -> x.department));
并将仿函数应用于每个值。但是在 Map
接口(interface)中没有将值转换为不同类型的方法。在我的例子中,将 List 缩减为 Double
。标准 SE API 仅提供方法 replaceAll()将值转换为相同类型...
将 Map
值转换为不同类型的 Java 8 风格方法/技巧/单行代码是什么?像伪代码一样工作:
Map<K, V2> map2 = new HashMap<>();
for (Map.Entry<K, V1> entry : map1.entrySet()) {
map2.add(entry.getKey(), Function<V1, V2>::apply(entry.getValue()));
}
最佳答案
你想要:
Map<K, V2> map2 =
map1.entrySet().stream()
.collect(toMap(Map.Entry::getKey,
e -> f.apply(e.getValue()));
其中 f 是从 V 到 V2 的函数。
关于Java 8 流 API - 是否有标准方法将 Map 中的每个值处理为不同类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24986266/