Java Map computeIfAbsent проблема - PullRequest
       8

Java Map computeIfAbsent проблема

0 голосов
/ 19 декабря 2018

Итак, я обнаружил любопытство с помощью метода Java Map computeIfAbsent (с использованием java8), и я надеюсь, что кто-то может сказать мне, почему это происходит, поскольку я не могу в действительности следовать логике этой проблемы.

Итак,У меня есть карта с ключом (очевидно), и значением является список, и я использую computeIfAbsent, чтобы создать новый список, когда ключ еще не установлен.Теперь, когда я использую Integer в качестве ключа, я могу использовать следующее:

List<Object> list = map.computeIfAbsent(1, ArrayList::new);

Но когда я использую String в качестве ключа, пытаясь использовать

List<Object> list = map.computeIfAbsent("key", ArrayList::new);

, я получаю ошибку, что The method computeIfAbsent(String, Function<? super String,? extends List<Object>>) in the type Map<String,List<Object>> is not applicable for the arguments (String, ArrayList::new).Не хватает только реализации?Используя строковый ключ, я должен использовать такой метод, который затем снова работает.

List<Object> list = map.computeIfAbsent("key", k -> new ArrayList<>());

Может быть, кто-то может просветить меня об этом.Спасибо:)

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Ваша вторая попытка

List<Object> list = map.computeIfAbsent("key", ArrayList::new);

будет на самом деле равна

List<Object> list = map.computeIfAbsent("key", k -> new ArrayList<>(k));

, и, поскольку ArrayList не имеет конструктора, принимающего String в качестве параметра, он не работает.Первый пример работает, так как создает список с одним элементом.

0 голосов
/ 19 декабря 2018

Функция отображения - Function<? super K, ? extends V> mappingFunction - сопоставляет ключ со значением, поэтому, когда ключ равен Integer, ArrayList::new работает, так как ArrayList имеет конструктор, который принимает int (начальную емкость).С другой стороны, у него нет конструктора, который принимает String.

Поскольку ключ, вероятно, не должен влиять на начальную емкость ArrayList, здесь не следует использовать ссылку на метод(в обоих случаях).Используйте лямбда-выражение.

Чтобы сделать его более понятным:

List<Object> list = map.computeIfAbsent(1, ArrayList::new);

ведет себя подобно:

List<Object> list = map.computeIfAbsent(1, k -> new ArrayList<>(k));

, поэтому он создаст ArrayList с начальной емкостью 1.

С другой стороны:

List<Object> list = map.computeIfAbsent("key", ArrayList::new);

ведет себя подобно:

List<Object> list = map.computeIfAbsent("key", k -> new ArrayList<>(k));

, где k - это String, поэтому он не проходитсборник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...