почему я не могу сослаться на Function.identity как ссылку на метод в сборщике - PullRequest
2 голосов
/ 11 января 2020

Может кто-нибудь подсказать, почему я не могу применить здесь ссылку на метод?

Рабочий код.

System.out.println(
                Arrays.stream(str.split(" "))
                        .collect(Collectors.groupingBy(Function.identity(),Collectors.counting())));  

Ошибка компиляции, Не удается разрешить метод

System.out.println(
            Arrays.stream(str.split(" "))
                    .collect(Collectors.groupingBy(Function::identity,Collectors::counting)));

1 Ответ

7 голосов
/ 11 января 2020

Потому что groupingBy() ожидает Function, то есть то, что принимает один аргумент и возвращает что-то.

Function.identity() возвращает функцию.

Но Function::identity ссылается на метод identity(), который не принимает никаких аргументов, и поэтому не может использоваться в качестве функции.

Аналогично, groupingBy() ожидает в качестве второго аргумента экземпляр Collector. Collectors.counting() возвращает коллекционера. Таким образом, вы можете использовать это. Но Collector::counting ссылается на метод counting(), и одного метода, не имеющего аргументов, вообще недостаточно для реализации интерфейса Collector, который имеет 5 методов.

Чтобы сделать автомобильную аналогию, если Вы вызываете метод, ожидающий автомобиль, вы можете вызвать garage.getCar(), чтобы получить автомобиль и передать возвращенный автомобиль в качестве аргумента. Но проходить garage::getCar не имеет смысла, потому что это будет «то, что может дать вам машину». И это не может считаться Транспортным средством.

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