为何Java中Stream的iterator可转换为Iterable?
为什么Stream的iterator方法引用可以转换为Iterable?
这完全是Java函数式接口的特性在起作用,和Iterator与Iterable的继承关系没有关系,拆解来看:
- Iterable是函数式接口:虽然
Iterable看起来是普通接口,但它满足函数式接口的定义——只有一个未实现的抽象方法Iterator<E> iterator()(接口里的forEach、spliterator都是带默认实现的方法,不算抽象方法)。所以任何符合这个方法签名的函数、方法引用都可以直接赋值给Iterable类型。 - Stream的iterator方法签名匹配:
Stream接口的iterator()方法签名是Iterator<E> iterator(),和Iterable要求的抽象方法签名完全一致。 - 方法引用的作用:
stream::iterator这个方法引用,本质上就是实现了Iterable的iterator()方法——当你调用这个返回的Iterable的iterator()时,它就会调用传入的stream对象的iterator()方法,返回对应的迭代器。
你可以把这段代码换成等价的Lambda表达式,就更容易理解了:
public static <E> Iterable<E> iterableOf(Stream<E> stream){ return () -> stream.iterator(); }
这个Lambda和原代码的方法引用是完全等价的,都是在实现Iterable的唯一抽象方法。
这种写法的实用场景是:可以把Stream适配到需要Iterable的上下文里,比如增强for循环中直接遍历Stream的元素。
内容的提问来源于stack exchange,提问作者jakchang
相关产品推荐
相关产品推荐

