【问题标题】:Lazy flatMap implementation algorithm in java 10java 10中的懒惰flatMap实现算法
【发布时间】:2019-02-19 03:40:48
【问题描述】:

我知道java流,并尝试实现map,filter,fold(以自定义函数作为参数),严格和惰性评估方式。

但是我无法在 java 中实现 flatmap 的惰性实现。 法线贴图、过滤器、折叠只是在主迭代器(如果它的列表)上运行的组合函数,如果传入值为 null,则丢弃函数的应用。

然而 flatMap 输入函数会产生另一个需要展平的列表(流),

java 10 中的lazy flatMap 是如何实现的?有没有关于算法的文档?

谢谢。

【问题讨论】:

  • 已修复,但您的问题是什么?一般如何实现惰性操作?只需重复调用tryAdvance 直到得到结果,而不是运行forEachRemaining。实际的问题应该是,为什么他们在第一个版本中没有正确地做到这一点。 This alternative implementation 在 Java 10 之前就已经存在了。
  • 知道了,谢谢,我在看 fold 而不是 findFirst 类似的,这是懒惰的谢谢

标签: java functional-programming


【解决方案1】:

如果你想实现惰性flatMap,最重要的部分是提供Iterator的正确实现。此实现可能如下所示:

final class FlatMappedIterator<A, B> implements Iterator<B> {
    private final Iterator<A> iterator;
    private final Function<A, Iterable<B>> f;
    private Iterator<B> targetIterator; // Iterator after applying `f` to element of type A

    FlatMappedIterator(Iterator<A> iterator, Function<A, Iterable<B>> f) {
        this.iterator = iterator;
        this.f = f;
    }

    @Override
    public boolean hasNext() {
        if (targetIterator != null && targetIterator.hasNext()) {
            return true;
        } else if (iterator.hasNext()) {
            A next = iterator.next();
            Iterable<B> targetIterable = f.apply(next);
            targetIterator = targetIterable.iterator();
            return targetIterator.hasNext();
        } else {
            return false;
        }
    }

    @Override
    public B next() {
        if (hasNext()) {
            return targetIterator.next();
        } else {
            throw new NoSuchElementException();
        }
    }
}

所以下一个元素的检索被推迟到hasNextnext被调用的那一刻。

然后你需要自己实现flatMap函数。但这很容易。我把它作为练习留给读者:)

【讨论】:

    猜你喜欢
    • 2018-02-27
    • 2020-05-04
    • 2021-08-12
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    相关资源
    最近更新 更多