为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

温温酱 2023-05-10 13:16:05
@FunctionalInterfacepublic 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 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

empty()返回一个方法引用Collections::emptyIterator

为了使此代码通过编译,该方法引用必须符合接口的单个抽象方法Streamable<>

CollectionsemptyIterator()接受任何参数并返回一个Iterator<T>.

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

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


查看完整回答
反对 回复 2023-05-10
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

作为记录,这是完全限定的名称 : 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>。


查看完整回答
反对 回复 2023-05-10
  • 2 回答
  • 0 关注
  • 154 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信