【发布时间】:2017-11-27 10:26:56
【问题描述】:
示例代码:
class Outer {
public Integer i;
Outer(Integer i) {
this.i = i;
}
public int getVal() { return i; }
}
class MyClass {
public Integer f(Outer o) { return o.getVal();};
public void main() {
MyClass g = new MyClass();
List<Integer> l1 = Arrays.asList(new Outer(2)).stream().map(g::f).collect(Collectors.toList());
List<Integer> l2 = Arrays.asList(new Outer(2)).stream().map(Outer::getVal).collect(Collectors.toList());
}
}
使用任一方法引用
Outer::instanceMethod不带参数,基本上是Supplier<T>功能接口。 [1]MyClass::instanceMethod接受Outer类型的参数并且是Function<T,R>functional 接口。 [1]
有效。那么map 函数如何知道将选项(1)中的函数应用于流的对象,但将流对象传递给选项(2)中的函数?
[1]https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html
【问题讨论】:
-
在每种情况下,它都是唯一可以编译的选项。尽管我不确定在哪里,但我确信 JLS 会详细说明。
-
请注意,在这种情况下,outer::instanceMethod 不是供应商。它也是一个函数。函数的输入是
this(即调用方法的outer实例),输出是方法返回的值。 -
@JBNizet 我怀疑这种行为。例如,在 Python 中,默认情况下,所有类函数都将
this作为第一个参数传递,因此没有函数具有“零”参数。但是文档中哪里提到了这种行为/约定? -
附带说明,
Arrays.asList(new outer(2)).stream()以非常复杂的方式创建单个元素流,将实例包装在数组中,将数组包装在列表中,最终从列表创建流.只需改用Stream.of(new outer(2))。
标签: java java-8 java-stream