Java 8 Map слияния VS вычислить, существенная разница? - PullRequest
2 голосов
/ 28 сентября 2019

Похоже, что методы слияния и вычисления Map созданы для уменьшения if ("~ ключ здесь существует ~") при установке.Моя проблема: добавить на карту пару [ключ, значение], когда я ничего не знаю: ни ключ, ни существующий на карте, ни его нет, но он имеет значение или значение == нуль или ключ == ноль.

words.forEach(word ->
        map.compute(word, (w, prev) -> prev != null ? prev + 1 : 1)
);
words.forEach(word ->
        map.merge(word, 1, (prev, one) -> prev + one)
);

Единственная разница 1 перемещается из Bifunction в параметр?Что лучше использовать?Есть ли какие-либо из слияний, вычислений предполагает наличие ключа / Val?И в чем их принципиальная разница?

1 Ответ

3 голосов
/ 28 сентября 2019

Документация Map#compute(K, BiFunction) гласит:

Пытается вычислить сопоставление для указанного ключа и его текущего сопоставленного значения (или null, если нет токаотображение).Например, чтобы создать или добавить String msg к отображению значения:

map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))

(метод merge() часто проще использовать для таких целей.)

Если функция переназначения возвращает null, отображение удаляется (или остается отсутствующим, если изначально отсутствует).Если сама функция переназначения выдает (непроверенное) исключение, исключение перебрасывается, и текущее отображение остается неизменным.

Функция переназначения не должна изменять эту карту во время вычисления.

И документация Map#merge(K, V, BiFunction) гласит:

Если указанный ключ еще не связан со значением или связан с нулем, связывает его с заданным ненулевымстоимость.В противном случае заменяет связанное значение результатами данной функции переназначения или удаляет, если результат равен null.Этот метод может быть полезен при комбинировании нескольких сопоставленных значений для ключа.Например, чтобы создать или добавить String msg к отображению значения:

map.merge(key, msg, String::concat)

Если функция переназначения возвращает null, отображение удаляется.Если функция переназначения сама генерирует (непроверенное) исключение, исключение перебрасывается, и текущее отображение остается неизменным.

Функция переназначения не должна изменять эту карту во время вычислений.

Важные различия:

  • Для compute(K, BiFunction<? super K, ? super V, ? extends V>):

    • BiFunction всегда вызывается .
    • BiFunction принимает данный ключ и текущее значение, если оно есть, в качестве аргументов и возвращает новое значение.
    • Предназначен для получения ключа и текущего значения (если оно есть), выполнения произвольных вычислений и возврата результата.Вычисление может быть операцией сокращения (то есть слиянием), но это не обязательно.
  • Для merge(K, V, BiFunction<? super V, ? super V, ? extends V>):

    • BiFunction вызывается только в том случае, если заданный ключ уже связан с ненулевым значением .
    • BiFunction принимает текущее значение и данное значение в качестве аргументов и возвращает новыйстоимость.В отличие от compute, ключ BiFunction не задан.
    • Предназначен для принятия двух значений и сведения их в одно значение.
...