Как передать функцию в качестве параметра в метод computeIfAbsent? - PullRequest
0 голосов
/ 18 февраля 2019

Я новичок в Java, своего рода переход с C # на Java.java.util.function имеет интерфейс, определенный как Function, который вводится в computeIfAbsent метод Map.

Я хотел определить и делегировать эту функцию методу computeIfAbsent.

map.computeIfAbsent(key, k => new SomeObject())

работает, но Я хотел это с обратным вызовом, где func. Но проблема в том, что Function требует определения входного параметра.Как мне установить void или без аргументов.

map.computeIfAbsent(key, func);

Ответы [ 5 ]

0 голосов
/ 18 февраля 2019

computeIfAbsent принимает два параметра:

  • key - ключ, с которым должно быть связано указанное значение
  • mappingFunction - функция для вычисления значения (это тип Function , функциональный интерфейс, который принимает один аргумент и возвращает результат).

Нет другого способа указать параметры для метода computeIfAbsent.Вот пример использования этого метода Map:

Вход: Map<String, Integer> map: {four=4, one=1, two=2, three=3, five=5}

map.computeIfAbsent("ten", k -> new Integer(10));   // adds the new record to the map
map.computeIfAbsent("twelve", k -> null);           // record is not added, the function returns a null
map.computeIfAbsent("one", k -> new Integer(999999));   // record is not updated, the key "one" already exists -
                                                        // and has a non-null value
map.put("eleven", null);                                // new record with null value
map.computeIfAbsent("eleven", k -> new Integer(11));    // updates the record with new value

Выход: {four=4, one=1, eleven=11, ten=10, two=2, three=3, five=5}


Рассмотримкод : map.computeIfAbsent("ten", k -> new Integer(10));

Код говорит, что я хочу вставить новое отображение (пара ключ-значение) в map.В методе computeIfAbsent необходимо указать ключ , который равен «десять».Значение является производным от Function, который принимает ключ в качестве входного параметра и выдает результат;результат устанавливается как значение для сопоставления.

В этом примере пара ключ-значение добавляется на карту: «десять», 10.

Лямбда-выражение k -> new Integer(10) равноэкземпляр функционального интерфейса Function<String, Integer>.Код также может быть представлен как:

Function<String, Integer> fn = k -> new Integer(10);
map.computeIfAbsent("ten", fn);
0 голосов
/ 18 февраля 2019

computeIfAbsent(Key, Function), используемый для вычисления значения для данного ключа с использованием данной функции отображения, если ключ еще не связан со значением (или сопоставлен со значением NULL), и введите это вычисленное значение в Hashmap, иначе NULL.согласно синтаксису

public V computeIfAbsent(K key, Function<? super K, ? extends V> remappingFunction)

вы можете написать -

map.computeIfAbsent(key, k -> Object()); или

map.computeIfAbsent(key, k -> fun());
0 голосов
/ 18 февраля 2019

computeIfAbsent всегда будет иметь входной параметр для переданного Function - это будет ключ.

Поэтому, так же, как вы можете написать:

map.computeIfAbsent(key, k -> new SomeObject());

вы можететакже напишите (при условии, что ключ вашего Map является String):

Function<String,SomeObject> func = k -> new SomeObject();
map.computeIfAbsent(key, func);
0 голосов
/ 18 февраля 2019

Если func не требует больших вычислительных затрат и не имеет побочных эффектов, тогда вы можете просто использовать putIfAbsent (обратите внимание, это ' put ', а не 'compute') и вызывать метод напрямую.Это семантически эквивалентно.

map.putIfAbsent(key, func());

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

0 голосов
/ 18 февраля 2019

Вы можете просто создать лямбду, которая принимает параметр и вызывает вашу функцию, игнорируя параметр.

map.computeIfAbsent(key, k -> func());
...