当前位置: 首页 > 知识库问答 >
问题:

java 10中的懒惰平面图实现算法

方航
2023-03-14

我了解java streams,并尝试实现map、filter、fold(使用自定义函数作为参数),包括严格的和惰性的计算方法。

然而,我无法在java中实现flatmap的惰性实现。Normal map、filter、fold只是在主迭代器(如果是它的列表)上运行的组合函数,如果传入值为null,则丢弃函数的apply。

但是flatMap输入函数会生成另一个列表(流),需要将其展平,

lazy flatMap是如何在Java10中实现的?有关于算法的文件吗?

谢谢

共有1个答案

白才艺
2023-03-14

如果要实现lazyflatMap,最重要的部分是提供正确的迭代器实现。此实现可以如下所示:

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函数本身。但这很容易。我把它作为练习留给读者:)

 类似资料:
  • 这是一个相当做作的例子。另外,我知道flatten和concat将给出嵌套级别不同的序列。 我试图弄清楚为什么flatten似乎能打破这种懒惰,尽管我对Clojure.core代码的理解有限,但我认为并非如此。

  • 问题内容: 我最近读到了Python 3的一个好处是它很懒。那就更好了 而不是 我很好奇的是如何使用这种懒惰。如果生成映射对象,例如,如何访问生成的操作/列表中的特定元素。在我所见过的几乎所有文档中,他们都会做类似或的事情(据我所知),它放弃了惰性概念,因为它隐式将地图转换为列表。 我想我正在寻找的是能够以与我可以懒惰地懒惰地生成地图对象类似的方式使用地图对象的能力,并且可以在没有巨大计算量的情况

  • 我有一个数据表的问题-懒加载。我认为问题是在IdiomasBean.java(TableBean.java),如果我把: 我得到了正确的数据表,但是<代码>按排序、筛选和不起作用。 我得到:java。lang.NullPointerException这里是堆栈跟踪: 下面是代码的其余部分: 指数xhtml diomasBean.java 懒散的数据模型。JAVA IdiomasBo.java 习语

  • 本文向大家介绍groovy 懒惰的表达,包括了groovy 懒惰的表达的使用技巧和注意事项,需要的朋友参考一下 示例 我们可以在字符串中进行惰性插值。这与普通插值不同,因为每当将GString转换为String时,它可能具有不同的值(取决于闭包)。            

  • 描述 (Description) Lazy DynaBeans是DynaBean的一个实现,它提供了Lazy List和Lazy Map的特性,它连接了DynaClass的属性。 有两种类型的Lazy DynaBeans: LazyDynaBean :它指定惰性DynaBean,它提供名称和数据类型的动态修改属性。 LazyDynaMap :它通过使用惰性映射或列表系统,使DynaBean的轻量级