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

懒惰流在Java8中是如何实现的?

姚海
2023-03-14

共有1个答案

邢承弼
2023-03-14

为什么你需要反思才能变得懒惰?例如,考虑这个类:

class LazySeq<T> {

    private final List<T> list;
    private Predicate<? super T> predicate;

    public LazySeq(List<T> input) {
        this.list = new ArrayList<>(input);
    }

    //Here you just store the predicate, but you don't perform a filtering
    //You could also return a new LazySeq with a new state
    public LazySeq<T> filter(Predicate<? super T> predicate) {
        this.predicate = predicate;
        return this;
    }

    public void forEach(Consumer<? super T> consumer){
        if(predicate == null) {
            list.forEach(consumer);
        } else {
            for(T elem : list) {
                if(predicate.test(elem)) {
                    consumer.accept(elem);
                }
            }
        }
    }
}

在惰性seq上调用filter时,筛选不会立即发生,例如:

LazySeq<Integer> lazySeq = new LazySeq<>(Arrays.asList(1, 2, 3, 4));
lazySeq = lazySeq.filter(i -> i%2 == 0);

如果在调用filter之后看到序列的内容,您将看到它总是1,2,3,4。但是,当调用终端操作(如foreach)时,筛选将在使用使用者之前完成。例如:

lazySeq.filter(i -> i%2 == 0).forEach(System.out::println);
 类似资料:
  • 我正在尝试实现一个流,该流在其实现中使用自身的另一个实例。流前面有几个常量元素(使用IntStream.concat),所以只要连接的流懒散地创建非常量部分,这就可以工作。我想使用StreamSupport。intStream重载使用intStream获取供应商。concat(它“创建一个懒散连接的流”)应该足够懒惰,只在需要元素时创建第二个拆分器,但即使创建流(而不是计算流)也会溢出堆栈。我如何

  • 我正在寻找一种用Java8流模拟以下行为的方法。给定一个年份流,对它们进行排序,以便输出前10个值,这样,在输出一年之后,该值将减少,并且迭代重新开始再一次resorting: 如果我输入2005年、2020年、2000年、1967年和2018年,我期望以10为限得出以下结果: 我使用的测试是: 但看起来sorted()一点也不懒。整个排序在beggining处完成一次,因此在任何进一步操作之前要

  • 我了解java streams,并尝试实现map、filter、fold(使用自定义函数作为参数),包括严格的和惰性的计算方法。 然而,我无法在java中实现flatmap的惰性实现。Normal map、filter、fold只是在主迭代器(如果是它的列表)上运行的组合函数,如果传入值为null,则丢弃函数的apply。 但是flatMap输入函数会生成另一个列表(流),需要将其展平, lazy

  • 问题内容: 考虑以下代码: 当第一个URL够用时会被要求输入第二个URL吗? 我尝试了一个较小的示例,它看起来像预期的那样工作。即一个一个地处理数据,但是可以依靠这种行为吗?如果没有,在帮助之前打电话吗? 输出: 更新 :如果对实施很重要,请使用官方Oracle JDK8 答案 :根据下面的评论和答案,flatmap部分是惰性的。即完全读取第一个流,并且仅在需要时才读取下一个。渴望读取一个流,但是

  • 问题内容: 我的问题很简单,如何使这段代码变得懒惰: 上面的代码可以计算组合,但是可以在内存中创建整个数组数组。我需要让它返回类似的东西,除了Swift类型系统不允许我做一些通用的事情。 有什么想法如何实现这一目标并保持功能风格吗? 附注:我确实想过用生成器解决这个问题并跟踪索引的另一种方法,但是我不想跟踪任何状态,我想要一个纯函数式(如FP中)的解决方案。Haskell默认情况下会这样做,顺便说

  • 问题内容: 我想一次从Python的文件/流中读取多个JSON对象。不幸的是刚刚s,至文件结束-; 似乎没有任何方法可以使用它来读取单个对象或延迟迭代这些对象。 有什么办法吗?使用标准库将是理想的选择,但是如果有第三方库,我会改用它。 目前,我将每个对象放在单独的行上并使用,但我真的不希望这样做。 使用范例 example.py in.txt 示例会话 问题答案: 这是一个非常简单的解决方案。秘诀