java - 流接口(interface) : How empty() method returns Iterable?

标签 java java-8

@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<> 的单一抽象方法。界面。

CollectionsemptyIterator()不接受参数并返回 Iterator<T> .

Streamable<>扩展了 Iterable<T>Supplier<Stream<T>> ,这意味着它必须实现两个方法( iterator()get() ),但其中一个不能是抽象的(否则它就不是函数式接口(interface))。

CollectionsemptyIterator()可以符合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/

相关文章:

java - 根据情况初始化具有相同名称的变量

java - Eclipse 中使用 Hibernate 时出现 org.hibernate.HibernateException 错误。!@!

java8 将 Map<X,Y> + Map<Y,Z> 转换为 Map<X,Z>

java - 并行处理多个任务(在 java-8 中)

Java HashMap 遍历每个循环,但所有值都相同,是循环的最后一个值

Java 8 - 并行调用异步方法并合并它们的结果

尝试在 glassfish 中动态加载类时出现 java.lang.ClassNotFoundException

java - 在 JTextComponent java 中输入时触发事件

java - java代码设置日期和时间的问题

Java 8 类型推断错误