2 回答
TA贡献1830条经验 获得超3个赞
empty()
返回一个方法引用Collections::emptyIterator
。
为了使此代码通过编译,该方法引用必须符合接口的单个抽象方法Streamable<>
。
Collections
不emptyIterator()
接受任何参数并返回一个Iterator<T>
.
Streamable<>
扩展了Iterable<T>
和Supplier<Stream<T>>
,这意味着它必须实现两个方法(iterator()
和get()
),但其中一个不能是抽象的(否则它就不是函数式接口)。
Collections
的emptyIterator()
可以符合Iterable<T>
的Iterator<T> iterator()
签名。
因此,如果Streamable<T>
有一个默认实现的Supplier<Stream<T>>
方法get()
(如果没有,Streamable<T>
则不能是功能接口),Collections::emptyIterator
可以实现该Streamable<T>
接口。
编辑:如果您指的是org.springframework.data.util.Streamable,您可以看到它确实有一个默认实现get()
:
/*
* (non-Javadoc)
* @see java.util.function.Supplier#get()
*/
default Stream<T> get() {
return stream();
}
因此,任何符合单一抽象方法的方法引用都Iterator<T> iterator()可以实现该接口。因此Collections::emptyIterator可以实施Streamable<T>。
TA贡献1824条经验 获得超5个赞
作为记录,这是完全限定的名称 : org.springframework.data.util.Streamable
。
问题是在当前上下文中:
static <T> Streamable<T> empty() {
return Collections.emptyIterator();
}
与以下内容不同:
static <T> Streamable<T> empty() {
return Collections::emptyIterator;
}
return Collections.emptyIterator()返回一个Iterator对象,而该方法需要一个Streamable. 那确实不能像你想象的那样编译。
但return Collections::emptyIterator不返回Iterator对象。Streamable相反,它定义了与返回的功能接口对象关联的 lambda 主体empty()。
其实这个方法参考:
return Collections::emptyIterator;
相当于:
return () -> Collections.emptyIterator();
为什么有效?
因为Streamable是定义为函数的功能接口:()-> Iterator<T> 并emptyIterator()返回Iterator<T>。
添加回答
举报