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

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

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

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

Спасибо

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

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

person sagioto    schedule 28.01.2014    source источник


Ответы (2)


Это прекрасно компилируется (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 издевается над вами!

person assylias    schedule 28.01.2014
comment
Спасибо, я использую b124 и IDEA 12.1.6. Как вы сказали, IDEA просто жалуется, но этот код работает нормально. - person sagioto; 29.01.2014
comment
Я видел ту же проблему в IDA 13.1.6. Та же самая строка кода в режиме фрагмента кода отладчика выдает ложную ошибку «Нет такой статической ошибки метода»; хотя код работает нормально. - person Jason D; 30.09.2015

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

person newacct    schedule 29.01.2014