【问题标题】:Kotlin: Iterable<T> from Sequence<T>Kotlin:来自 Sequence<T> 的 Iterable<T>
【发布时间】:2018-07-22 09:59:24
【问题描述】:

在 Kotlin 中,我如何从 Sequence&lt;T&gt;Stream&lt;T&gt; 获得 Iterable&lt;T&gt;

在 Java 中,我可以通过以下方法获取 Iterable&lt;T&gt;s,但等效的 Kotlin 代码不起作用:

final Stream<T> s = /*get Stream*/;
final Iterable<T> i1 = s::iterator;
final Iterable<T> i2 = () -> s.iterator();

【问题讨论】:

    标签: kotlin iterator java-stream iterable method-reference


    【解决方案1】:

    由于 Kotlin 具有一流的函数类型,仅提供 lambda 或方法引用不足以将表达式强制转换为某些 Java 接口。但是,有一个简洁的语法可以实现单抽象方法接口:

    val s: Stream<T> = /* get a stream */
    val i = Iterable { s.iterator() }
    

    【讨论】:

    • 等等,为什么SAM转换不适用于val i: Iterable&lt;Int&gt; = { s.iterator() }
    • 会不会是因为Iterable没有用@FunctionalInterface注解?
    • 这有什么关系?在 Java 中,任何单方法接口都是函数式接口,无论是否带注释。 Kotlin 中关于 @FunctionalInterface 注释的规则是否不同?
    • @klitos 不应该,但事实是,Kotlin 不接受 Iterable 作为 SAM 转换的目标。我提供了对该行为的合理解释,即使它可能被视为错误。
    猜你喜欢
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 2013-12-06
    相关资源
    最近更新 更多