@FunctionalInterface
public interface Streamable<T> extends Iterable<T>, Supplier<Stream<T>>
我正在探索 Streamable Interface,我遇到的第一个方法是 empty()
具有以下定义的方法。
static <T> Streamable<T> empty() {
return Collections::emptyIterator;
}
Collections::emptyIterator
返回 Iterator<T>
但是这个方法的返回类型是Streamable<T>
. Streamble 扩展了 Iterable 和 Supplier 而不是 Iterator 接口(interface)。
我不明白它是如何工作的。 有人可以帮助我理解这一点吗?
我只是没能理解这里的概念。我想知道这是如何工作的,因为我知道继承是如何工作的,但我无法弄清楚。我想我在这里遗漏了一些东西。
最佳答案
empty()
返回方法引用 Collections::emptyIterator
.
为了使此代码通过编译,该方法引用必须符合 Streamable<>
的单一抽象方法。界面。
Collections
的 emptyIterator()
不接受参数并返回 Iterator<T>
.
Streamable<>
扩展了 Iterable<T>
和 Supplier<Stream<T>>
,这意味着它必须实现两个方法( iterator()
和 get()
),但其中一个不能是抽象的(否则它就不是函数式接口(interface))。
Collections
的 emptyIterator()
可以符合Iterable<T>
的 Iterator<T> iterator()
签名。
所以如果Streamable<T>
默认实现 Supplier<Stream<T>>
的 get()
方法(如果不是,Streamable<T>
不能是功能接口(interface)),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()
, 可以实现该接口(interface)。因此Collections::emptyIterator
可以实现Streamable<T>
.
关于java - 流接口(interface) : How empty() method returns Iterable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57285737/