Что такое класс ссылок на методы?


У меня есть следующий код:

List<Person> personList = getPersons();    
List<Function<List<Person>, Stream<Person>>> streams = new ArrayList<>();
streams.add(p -> p.stream());
streams.add(p -> p.parallelStream());

Идея Intellij предполагает, что я должен заменить лямбда-выражения ссылками на методы. Я бы хотел сделать это, только я не уверен, каким должен быть новый универсальный тип списка потоков. Я попытался оценить выражение personList:: stream, но я получаю "нет такого поля экземпляра: 'stream'". Если я попробую List:: stream или ArrayList:: stream (конкретный тип списка персон), я получу: "нет такого статического поля: 'stream'". Есть ли способ добавить ссылки на методы список? если да, то каким должен быть общий тип списка?

Спасибо

Как отметил ассилий, IDEA просто жаловалась, и код работал без проблем, У меня все еще были проблемы с тем же кодом в IDEA 13 начиная с потоков.добавьте ожидаемую функцию, которая возвращает Stream и List:: stream возвращает Stream. Для ее решения я использовал следующий код:

List<Person> personList = getPersons();
List<Supplier<Stream<Person>>> streams = new ArrayList<>();
streams.add(personList::stream);
streams.add(personList::parallelStream);
2 2

2 ответа:

Это компилирует fine (b119):

List<String> personList = Arrays.asList("a", "b");
List<Function<List<String>, Stream<String>>> streams = new ArrayList<>();
streams.add(List::stream);
streams.add(List::parallelStream);

Вы можете использовать старую сборку jdk или IntelliJ шутит с вами!

personList::stream это в основном то же самое, что p -> p.stream(). Ни у того, ни у другого нет типа как такового. Тип выражения - это тип контекста, который его принимает.