不可变的 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
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