Java 8 流 API - 是否有标准方法将 Map 中的每个值处理为不同类型?

标签 java java-8

我学习Java 8 Lambda Expressionsstream 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/

相关文章:

java - 自动调整 JButton 图标大小

java - 我们可以在单个 POM 页面中为相同的 Web 元素变量存储不同的定位器(xpath、css、id、名称)类型吗

java - 如何解析 Play 2.3.x 中 WebService 调用的响应

Java 反射 : Get concrete type of implemented generic interface

Java如何按区域设置字段对列表进行排序?

java - 如何使用 Stream.of 创建一个只有一个元素的 Stream<String[]>?

spring - JPA 中的 Java 8 日期时间 API

java - 为什么 Math.floor 返回一个 double 值?

java - Java-8 中的方法引用和泛型

java - 使用 Java 8 Stream API 过滤嵌套列表