Не удается инициализировать новый список как значение карты с помощью оператора ::?

Работая над проектом карточной игры, я пытался создать новую Карту, уже имея Список, который хотел использовать в качестве набора ключей. Карта должна использовать ключи типа Player, и каждый из них должен содержать значение, состоящее из одного List<Trick>, где Player является интерфейсом и Трюк - это класс.

Первоначально я пытался использовать поток из List<Player> players, который у меня был, а затем собирал его на карту следующим образом:

private Map<Player, List<Trick>> playerTricks = players.stream()
        .collect(Collectors.toMap(x -> x, ArrayList::new));

Моя IDE, IntelliJ, не позволила мне этот формат, так как он сказал: «Не удается разрешить конструктор ArrayList».

К моему большому удивлению, среда IDE перестала жаловаться, когда я удалил :: -оператор:

(Collectors.toMap(x -> x, x -> new ArrayList<Trick>()));

Хотя сейчас у меня есть код без исключений, я до сих пор не могу понять, почему оператор разрешения области действия выдает такую ​​ошибку. Буду признателен, если кто-нибудь объяснит это правильно.

P.S. При поиске решения я нашел этот поток StackOverflow:

Сохранение нового объекта в качестве значения HashMap?

Это касается аналогичной проблемы, но на самом деле не решает проблему, с которой я столкнулся.

4 голоса | спросил Vasil Alistarov 3 AM00000020000000531 2018, 02:29:05

1 ответ


0
Второй параметр ---- +: = 0 =: + ---- принимает ---- +: = 1 =: + ----, который принимает тип потока и сопоставляет его с типом значенияновый ---- +: = 2 =: + ---- .Во-первых, ---- +: = 4 =: + ---- не называется оператором разрешения области действия, как в C ++, хотя он работает несколько схожим образом при создании ссылки на метод в Java.Это просто (просто) оператор двойной двоеточия.Ссылка на метод ---- +: = 5 =: + ---- не соответствует ---- +: = 6 =: + ---- , потому что нет ---- +: = 7=: + ---- конструктор.Ссылка на этот метод не может быть использована.Вы пытаетесь игнорировать аргумент ---- +: = 8 =: + ---- , но ссылка на метод должна использовать его.Когда вы заменяете ссылку на метод лямбда-выражением ---- +: = 9 =: + ---- , это соответствует ---- +: = 10 =: + ---- .Вы берете ---- +: = 11 =: + ---- , который неявно определен как ---- +: = 12 =: + ---- , а тип лямбда-выражения:---- +: = 13 =: + ---- , что соответствует.Вы игнорируете ---- +: = 14 =: + ---- ---- +: = 15 =: + ---- в лямбда-выражении еще до того, как оно дойдет до вызова createновый ---- +: = 16 =: + ---- .Ваше лямбда-выражение не эквивалентно ссылке на метод, потому что ваша ссылка на метод пытается найти конструктор ---- +: = 17 =: + ----, а лямбда-выражение принимает ---- +: = 18 =: + ---- и игнорирует его, просто явно вызывая конструктор no-arg ---- +: = 19 =: + ---- .
ответил rgettman 3 AM00000020000004031 2018, 02:42:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132