stream.js 是一个很小、完全独立的Javascript类库,它为你提供了一个新的Javascript数据结构:streams.
- <script src='stream-min.js'></script>
streams是什么?
Streams 是一个操作简单的数据结构,很像数组或链接表,但附加了一些非凡的能力。
它们有什么特别之处?
跟数组不一样,streams是一个有魔法的数据结构。它可以装载无穷多的元素。是的,你没听错。他的这种魔力来自于具有延后(lazily)执行的能力。这简单的术语完全能表明它们可以加载无穷多的元素。
入门
如果你愿意花10分钟的时间来阅读这篇文章,你对编程的认识有可能会被完全的改变(除非你有函数式编程的经验!)。请稍有耐心,让我来先介绍一下streams支持的跟数组或链接表很类似的基本功能操作。然后我会像你介绍一些它具有的非常有趣的特性。
Stream 是一种容器。它能容纳元素。你可以使用 Stream.make 来让一个stream加载一些元素。只需要把想要的元素当成参数传进去:
- var s = Stream.make( 10, 20, 30 );
- // s is now a stream containing 10, 20, and 30
足够简单吧,现在 s 是一个拥有3个元素的stream: 10, 20, and 30; 有顺序的。我们可以使用s.length() 来查看这个stream的长度,用 s.item( i ) 通过索引取出里面的某个元素。你还可以通过调用 s.head() 来获得这个stream 的第一个元素。让我们实际操作一下:
- var s = Stream.make( 10, 20, 30 );
- console.log( s.length() ); // outputs 3
- console.log( s.head() ); // outputs 10
- console.log( s.item( 0 ) ); // exactly equivalent to the line above
- console.log( s.item( 1 ) ); // outputs 20
- console.log( s.item( 2 ) ); // outputs 30
本页面已经加载了这个 stream.js 类库。如果你想运行这些例子或自己写几句,打开你的浏览器的Javascript控制台直接运行就行了。
我们继续,我们也可以使用 new Stream() 或 直接使用 Stream.make() 来构造一个空的stream。你可以使用 s.tail() 方法来获取stream里除了头个元素外的余下所有元素。如果你在一个空stream上调用 s.head() 或 s.tail() 方法,会抛出一个异常。你可以使用 s.empty() 来检查一个stream是否为空,它返回 true 或 false。
- var s = Stream.make( 10, 20, 30 );
- var t = s.tail(); // returns the stream that contains two items: 20 and 30
- console.log( t.head() ); // outputs 20
- var u = t.tail(); // returns the stream that contains one item: 30
- console.log( u.head() ); // outputs 30
- var v = u.tail(); // returns the empty stream
- console.log( v.empty() ); // prints true
这样做可以打印出一个stream里的所有元素:
- var s = Stream.make( 10, 20, 30 );
- while ( !s.empty() ) {
- console.log( s.head() );
- s = s.tail();
- }