То, как вы используете 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
, который дает вам больше гибкости, чем просто наносекунды, но вы, очевидно, можете изменить это в соответствии со своими потребностями:
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
.Равиндра показывает пример этого в своем ответе .