不可变的 JS 惰性 Seq 链式方法

Immutable JS lazy Seq chained method

Immutable JS 文档引用了 Seq 的惰性操作。特别是下面的例子:

var oddSquares = Immutable.Seq.of(1,2,3,4,5,6,7,8).filter(x => x % 2).map(x => x * x);

console.log(oddSquares.get(1));

它说 filter 被调用了 3 次,map 被调用了两次。我不明白导致方法分别被调用 3 次和 2 次的操作顺序。事实上,如果我不得不猜测正确的 "lazy" 操作是什么,我会期望它们根本不会被调用,因为它们不是执行请求操作所必需的(在集合中找到 1)。谁能帮我理解链式方法是如何调用的?

oddSquares.get(1)oddSquares.

中获取第二个元素

这意味着应该调用 .map(x => x * x); 两次以生成 2 个元素。

为了让 .map 获得 2 个元素作为其输入,.filter(x => x % 2) 应该产生 2 个元素。如我们所见,filter 谓词过滤奇数。

要从初始序列 Immutable.Seq.of(1,2,3,4,5,6,7,8) 中得到 2 个奇数,我们需要处理 3 个数字:1 是奇数,2 是偶数,3 是是奇数。

  Immutable.Seq.of     1 - 2 - 3 - 4 - 5 - 6 - 7 - 8
                       v   v   v 
filter(x => x % 2)     1 - - - 3
                       v       v 
   map(x => x * x)     1 - - - 9
                       v       v
            get(1)     - - - - 9