@FunctionalInterface
public interface Streamable<T> extends Iterable<T>, Supplier<Stream<T>>
我正在探索Streamable接口,遇到的第一个方法是具有以下定义的empty()
方法。
static <T> Streamable<T> empty() {
return Collections::emptyIterator;
}
Collections::emptyIterator
返回Iterator<T>
,但是此方法的返回类型为Streamable<T>
。 Streamble扩展了Iterable和Supplier而不是Iterator接口。
我不知道该怎么做。 有人可以帮我理解这一点吗?
我只是在这里没有理解这个概念。我想知道继承是如何工作的,所以我想知道它是如何工作的,但是我无法弄清楚。我想我在这里缺少什么。
答案 0 :(得分:5)
empty()
返回方法引用Collections::emptyIterator
。
为了使该代码能够通过编译,该方法引用必须与Streamable<>
接口的单个抽象方法一致。
Collections
的{{1}}不带参数,并返回一个emptyIterator()
。
Iterator<T>
扩展了Streamable<>
和Iterable<T>
,这意味着它必须实现两种方法(Supplier<Stream<T>>
和iterator()
),但是其中一种不能抽象(否则它将不是功能接口)。
get()
的{{1}}可以符合Collections
的{{1}}签名。
因此,如果emptyIterator()
具有Iterable<T>
的{{1}}方法的默认实现(如果没有,则Iterator<T> iterator()
不能是功能接口),{{1 }}可以实现Streamable<T>
接口。
编辑:如果您指的是org.springframework.data.util.Streamable,则可以看到它确实具有Supplier<Stream<T>>
的默认实现:
get()
因此,任何符合单个抽象方法Streamable<T>
的方法引用都可以实现该接口。因此Collections::emptyIterator
可以实现Streamable<T>
。
答案 1 :(得分:3)
为了记录,这是完全限定的名称:org.springframework.data.util.Streamable
。
问题是在当前情况下:
static <T> Streamable<T> empty() {
return Collections.emptyIterator();
}
和:p不同
static <T> Streamable<T> empty() {
return Collections::emptyIterator;
}
return Collections.emptyIterator()
返回一个Iterator
对象,而该方法需要一个Streamable
。确实无法按照您的预期进行编译。
但是return Collections::emptyIterator
不会返回Iterator
对象。相反,它定义了与Streamable
返回的empty()
功能接口对象相关的lambda主体。
实际上此方法参考:
return Collections::emptyIterator;
等效于:
return () -> Collections.emptyIterator();
为什么有效?
因为Streamable
是定义为函数的功能接口,所以()-> Iterator<T>
emptyIterator()
返回Iterator<T>
。