java - 如何合并两个 map <String, LocalDateTime> 并计算值之间的差异(以纳秒为单位)

标签 java lambda collections java-8 java-stream

大家。 我在尝试合并两个 map 时遇到了问题Map<String, LocalDateTime> 。 IDE 显示编译错误:

无法从静态上下文引用非静态方法

问题是我需要将它们合并为一个具有不同参数作为值的新参数,在这种情况下,我需要计算 LocalDateTime 之间的差异第一个 map 的 LocalDateTime 和第二个 map 的 LocalDateTime,因此结果应该是 Map<String, Long>

Map<String, Long> result = Stream.concat(logStartTimeMap.entrySet().stream(), logEndTimeMap.entrySet().stream())
                .collect(Collectors.toMap(
                        Map.Entry::getKey,
                        Map.Entry::getValue,
                        (value1, value2) -> new Long(ChronoUnit.NANOS.between(value1,value2))));

我在 Map.Entry::getKey、Map.Entry::getValue 行中收到错误。

还有一个排队 ChronoUnit.NANOS.between(value1,value2)因为 IDE 认为 value1 和 value2 是对象类型而不是时间类型。这很奇怪,因为之前我在结果 Map 中选择了不正确的参数类型时收到了该错误。但这里没关系,ChronoUnit.NANOS.between(value1,value2)返回 Long 并且 Map 结果以 Long 作为参数。

最佳答案

您使用Collectors.toMap的方式意味着您正在尝试返回 Map<String, LocalDateTime> 。那是因为Map.Entry::getKey返回 StringMap.Entry::getValue返回 LocalDateTime 。然后在合并函数中尝试返回 Long这与通用签名不匹配。

相反,您可以执行如下操作:

Map<String, LocalDateTime> map1 = ...;
Map<String, LocalDateTime> map2 = ...;

Map<String, Duration> result = map1.entrySet().stream().collect(Collectors.toMap(
        Map.Entry::getKey,
        entry -> Duration.between(entry.getValue(), map2.get(entry.getKey()))
));

上面计算了 Duration这为您提供了比纳秒更大的灵 active ,但您显然可以更改它以满足您的需求:

Map<String, LocalDateTime> map1 = ...;
Map<String, LocalDateTime> map2 = ...;

Map<String, Long> result = map1.entrySet().stream().collect(Collectors.toMap(
        Map.Entry::getKey,
        entry -> entry.getValue().until(map2.get(entry.getKey()), ChronoUnit.NANOS)
));
<小时/>

请注意,上面的两个示例均假设 map1的 key 集是 map2 的子集的按键设置。在 comment你说:

I have the same keys in both maps. The mathcing key have to be in the second map. So the situation where is no matching key is eliminated

这意味着假设是有效的。但是,如果该假设变得不正确,您需要做的就是添加一个过滤操作,在其中排除 map1 的任何条目。 map2 中不存在其 key 。 Ravindra 在 his answer 中展示了一个这样的示例.

关于java - 如何合并两个 map <String, LocalDateTime> 并计算值之间的差异(以纳秒为单位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58144516/

相关文章:

java - 如何使用 staxmate 获取(和输出)命名空间前缀声明

用于 LINQ 静态方法的 C++/CLI Lambda 选择器

c# - 反射 PropertyInfo.GetValue 来自集合

generics - 从通用集合中选择类型的子集

Java:使用 lambda 表达式对数组进行排序?

java - JPA - SortedSet 需要 OrderBy

java - 使用 byte[] 生成 key 会为 MAC 和 Windows 生成不同的结果

java - 比较器的 NoSuchMethodError?

java - Hazelcast 实现 java.io.NotSerializedException 时出现错误 JCache

java - 公共(public)静态最终 Lambda?