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

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


我不明白这是怎么回事。有人可以帮助我理解这一点吗?


我只是没能理解这里的概念。我想知道这是如何工作的,因为我知道继承是如何工作的,但我无法弄清楚。我想我在这里遗漏了一些东西。


温温酱
浏览 155回答 2
2回答

牛魔王的故事

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>。

沧海一幻觉

作为记录,这是完全限定的名称 : 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>。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java