java - 使用 Java 8 Stream API 处理 HashMap

标签 java hashmap java-stream

我有一个表单的哈希表

Map<String, Map<String,Double>

我需要处理它并创建另一个具有相同结构的。

按照示例解释目标

INPUT HASH TABLE
----------------------------
|       |   12/7/2000 5.0  |
| id 1  |   13/7/2000 4.5  |
|       |   14/7/2000 3.4  |
  ...
| id N  |      ....        |

 OUTPUT HASH TABLE
|  id 1 |    1/1/1800 max(5,4.5,3.4) |
  ...             ...

特别是,输出必须具有相同的键(id1,...,id n) 内部哈希表必须有一个固定的键(1/1/1800)和一个处理过的值。

我当前(不工作)的代码:

output = input.entrySet()
                        .stream()
                        .collect(
                                Collectors.toMap(entry -> entry.getKey(), 
                                        entry -> Collectors.toMap(
                                                e -> "1/1/2000",
                                                e -> {
                                            // Get input array
                                            List<Object> list = entry.getValue().values().stream()
                                                    .collect(Collectors.toList());

                                            DescriptiveStatistics stats = new DescriptiveStatistics();

                                            // Remove the NaN values from the input array
                                            list.forEach(v -> {
                                                if(!new Double((double)v).isNaN()) 
                                                    stats.addValue((double)v);
                                            });

                                            double value = stats.max();                         

                                            return value;
                                        }));

问题出在哪里?

谢谢

最佳答案

问题在于尝试在第一个 Collectors.toMap 中调用第二个类型 Collectors.toMapCollectors.toMap 应传递给接受 Collector 的方法。

这是实现您想要的目标的一种方法:

Map<String, Map<String,Double>>
output = input.entrySet()
              .stream()
              .collect(Collectors.toMap(e -> e.getKey(),
                                        e -> Collections.singletonMap (
                                            "1/1/1800",
                                            e.getValue()
                                             .values()
                                             .stream()
                                             .filter (d->!Double.isNaN (d))
                                             .mapToDouble (Double::doubleValue)
                                             .max()
                                             .orElse(0.0))));

请注意,不需要第二个Collectors.toMap。输出的内部 Map 每个都有一个条目,因此您可以使用 Collections.singletonMap 来创建它们。

关于java - 使用 Java 8 Stream API 处理 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46297400/

相关文章:

java - Java 中重写 equals() 方法 (OCJP)

C++ 模板化 HashMap 实现错误

java - 使用流从对象列表中包含的数组检索类型时出错

java - 如何使用 Java 8 流清除 HashMap 值内列表的内容

java - 使用流计算字符串中字符的出现次数

java - Android ListView header

java - 需要找出defineAsst模块中return语句的错误

java - 如何为 BouncyCaSTLeProvider 安全性添加库

java - 在 Collection View 中迭代 HashMap

java - map 中的 3 亿个项目