5

我已经阅读了有关序列的演练,但我真的不明白为什么有一种方法可以同时定义文字 Iterable 和文字序列。

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

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

那么,拥有 Iterable 花括号初始化程序的需要是什么?你什么时候想用它来代替方括号序列版本?

4

2 回答 2

7

流是懒惰的。

import ceylon.math.float {random}

value rng = {random()}.cycled;

所以这是一个懒惰的、无限的随机数流。random构造流时不会调用该函数。另一方面,一个序列会急切地评估它的参数,在这种情况下给你一次又一次地调用的结果random。另一个例子:

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

在这里,流rest分布在生成的流上,但仅在需要时。

于 2015-03-01T03:06:24.517 回答
5

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

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

在这里,我们避免实现长度为 1000 的整个序列,因为每个中间操作:、、和返回一个流甚至不需要具体化一个序列。cycledfilter()map()take()printAll()

于 2015-03-01T10:39:11.280 回答