当前位置: 首页 > 知识库问答 >
问题:

如何合并两个映射并以纳秒为单位计算值之间的差异

姬庆
2023-03-14

所有人。我在尝试合并两个映射map 时遇到了这个问题。IDE显示编译错误:

不能从静态上下文引用非静态方法

问题是,我需要将它们合并成一个新的,以不同的参数作为值,在这种情况下,我需要计算第一个映射的LocalDateTime和第二个映射的LocalDateTime之间的差值,因此结果应该是map

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))));

在行chronounit.nanos.between(value1,value2)中还有一个,因为IDE认为value1和value2属于对象类型,而不是临时类型。这很奇怪,因为以前我在结果映射中选择了不正确的参数类型时会出现这个错误。但是这里没有问题,chronounit.nanos.between(value1,value2)返回Long,Map result将Long作为参数。

共有1个答案

习斌
2023-03-14

您使用Collectors.tomap的方式意味着您试图返回映射 。这是因为map.entry::GetKey返回一个字符串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()))
));

上面计算的持续时间使您比只有纳秒更灵活,但您显然可以根据需要对其进行更改:

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的键集是map2的键集的子集。你在评论中说:

我在两张地图上都有相同的钥匙。计算键必须在第二个映射中。从而消除了没有匹配密钥的情况

这意味着这个假设是成立的。但是,如果这个假设变得不正确,那么您需要做的就是添加一个筛选操作,排除map1中键不在map2中的任何条目。拉文德拉在他的回答中展示了这方面的一个例子。

 类似资料:
  • 问题内容: 必须有一种更简单的方法来执行此操作。我有想要经常刷新的对象,因此我想记录它们的创建时间,对照当前时间戳进行检查,并根据需要刷新。 事实证明datetime.datetime很困难,我也不想深入ctime库。这样的事情有什么容易的吗? 问题答案: 如果要计算两个已知日期之间的差异,请使用以下方法: 86400.0 0

  • 问题内容: 有没有一种方法可以在MySQL中进行查询,以秒为单位提供两个时间戳之间的差异,还是需要在PHP中进行?如果是这样,我将如何去做? 问题答案: 您可以使用和函数,如下所示: 您还可以使用其他答案中建议的@Amber函数: 如果您使用的是数据类型,我猜想解决方案会稍微快一点,因为值已经存储为整数,代表自纪元(Source)以来的秒数。引用文档: 在列上使用时,该函数直接返回内部时间戳记值,

  • 问题内容: 我通过传递ipAddress来对方法进行调用,它会返回ipAddress的位置,例如国家/地区,城市等。因此,我试图查看每个调用花费的时间。因此,我在调用方法之前设置了start_time,在调用之后设置了end_time。 所以有时候我得到的差为0 。并且resp包含有效的响应。 因此,这意味着有时需要0毫秒才能恢复响应。任何建议将不胜感激。 问题答案: 试试这个

  • 问题内容: 我试图在几秒钟之内得到两个日期之间的差异。逻辑将是这样的: 设置一个初始日期,即现在; 设置最终日期,该日期将是初始日期加上将来的秒数(例如,假设15) 得到这两者之间的差(秒数) 之所以使用日期来做,是因为最终日期/时间取决于其他一些变量,并且永远不一样(取决于用户执行操作的速度),并且我还存储其他日期的初始日期。 我一直在尝试这样的事情: 问题是我永远都不会得到正确的区别。我尝试过

  • 假设我有一个类的,每个类都有一个。 中的键是时间戳,值是分数。 我试图创建一个,它可以组合所有对象的地图,并输出带有唯一时间戳(Thes)和平均分数的。 我有这个代码,但它给我所有分数的总和,而不是平均值(类没有平均值方法)。 我想这可能不是一个简单的问题,所以在一个单一的中解决,所以一个带有唯一时间戳的和所有分数的的输出也可以。然后我可以自己计算平均值。 它它可能吗?

  • 问题内容: 大家好, 在我的项目中,我需要计算 两个日期之间以秒为单位 的 时差 : 例如 : 然后我应该得到 86400秒, 即24小时。 类似地 它应该返回 60秒 。 我读了很多问题,其中 2分钟字段*之间的区别是 11:50:01和12:10:57 *** 问题答案: $timeFirst = strtotime(‘2011-05-12 18:20:20’); $timeSecond =