大家。
我在尝试合并两个 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
返回 String
和Map.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/