你为什么要在锡兰创造一个Iterable而不是一个序列?

时间:2015-03-01 02:27:57

标签: ceylon

我已经阅读了walkthrough about sequences,但我真的不明白为什么有办法定义文字Iterable和文字序列。

{String+} iterable = {"String1", "String2"};
[String+] sequence = ["String1", "String2"];

由于Sequence是Iterable的子类型,它似乎应该能够完成Iterable所做的一切以及更多。

那么是否需要使用Iterable花括号初始化程序?你想什么时候使用它而不是方括号序列版?

2 个答案:

答案 0 :(得分:7)

Streams很懒。

import ceylon.math.float {random}

value rng = {random()}.cycled;

这是一个懒惰的无限随机数流。构造流时不会调用函数random。另一方面,序列会急切地评估它的参数,在这种情况下,为您提供一次性调用random的结果。另一个例子:

function prepend<Element>(Element first, {Element*} rest) => {first, *rest};

此处,流rest分布在结果流上,但仅在需要时展开。

答案 1 :(得分:5)

正是@gdejohn所说的,但我想指出,如果您要对流应用多个操作,懒惰对于性能尤其重要,例如:

value stream = { random() }.cycled
        .filter((x) => x>0.5)
        .map((x) => (x*100).integer);
printAll(stream.take(1000));

这里我们避免永远实现长度为1000的整个序列,因为每个中间操作都是:cycledfilter()map()和{ {1}}返回一个流。甚至take()也不需要实现序列。