Почему я не могу использовать LinkedList :: new? - PullRequest
2 голосов
/ 07 марта 2019

Допустим, у меня есть HashMap как Map<Integer, List<Integer>> map = new HashMap<>();.

Теперь List<Integer> values = computeIfAbsent(key, ArrayList::new); работает отлично, но List<Integer> values = computeIfAbsent(key, LinkedList::new); выдает ошибку компиляции.

Я вижу конструкторы без аргументов как в ArrayList, так и в LinkedList. Что мне здесь не хватает, может кто-нибудь объяснить это поведение?

Ответы [ 3 ]

7 голосов
/ 07 марта 2019

То, что вы, вероятно, намереваетесь сделать, это указать выражение lamba для инициализации как:

List<Integer> values = map.computeIfAbsent(key, a -> new ArrayList<>());

или

List<Integer> values = map.computeIfAbsent(key, a -> new LinkedList<>());

Причина, по которой код

List<Integer> values = computeIfAbsent(key, LinkedList::new);

не скомпилируется, так как конструктор, ближайший к текущему синтаксису с одним аргументом, ожидает Collection<? extends E> c вместо Integer, следовательно, он не может быть разрешен.

С другой стороны, причина, по которой

List<Integer> values = map.computeIfAbsent(key, ArrayList::new);

скомпилируется, у него есть конструктор, принимающий int аргумент , , но обратите внимание на вместимость списка.

3 голосов
/ 07 марта 2019

Необходимая лямбда должна иметь подпись Function<? super K,? extends V> mappingFunction, поэтому, когда вы пишете:

List<Integer> values = map.computeIfAbsent(key, ArrayList::new);

должен быть указан конструктор с аргументом типа, совместимого с аргументом key (Integer). Существует один для ArrayList, но нет для LinkedList:

Конструкторы для ArrayList:

ArrayList ()

ArrayList (Коллекция c)

ArrayList (int initialCapacity)

Конструкторы для LinkedList:

LinkedList ()

LinkedList (Коллекция c)

Осторожно , что тот факт, что он работает для ArrayList, вероятно, не очень хороший момент, поскольку он создает пустой ArrayList с начальной емкостью (что может привести к странным эффектам границы).

Вы можете обратиться к Ссылка на метод в Java .

0 голосов
/ 07 марта 2019

Используйте следующую команду

List<Integer> values = map.computeIfAbsent(key, x -> new ArrayList<>());
...