Streamable接口:empty()方法如何返回Iterable?

时间:2019-07-31 07:48:06

标签: java java-8

@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接口。

我不知道该怎么做。 有人可以帮我理解这一点吗?

我只是在这里没有理解这个概念。我想知道继承是如何工作的,所以我想知道它是如何工作的,但是我无法弄清楚。我想我在这里缺少什么。

2 个答案:

答案 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>