什么是方法引用类?

时间:2014-01-28 13:42:00

标签: java intellij-idea java-8 method-reference

我有以下代码:

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建议我应该将lambda表达式替换为方法引用。 我想这样做,只是我不确定什么应该是流列表的新泛型类型。 我试着评估表达式personList :: stream,但我得到“没有这样的实例字段:'stream'”。如果我尝试List :: stream或ArrayList :: stream(人员列表的具体类型),我得到:“没有这样的静态字段:'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);

2 个答案:

答案 0 :(得分: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正在搞乱你!

答案 1 :(得分:2)

personList::streamp -> p.stream()基本相同。两者都没有类型。表达式的类型是接受它的上下文的类型。