- 浏览: 247777 次
- 性别:
- 来自: 深圳
-
文章分类
最新评论
-
di1984HIT:
写的不错。
使用JDBC进行批处理 -
huyuran:
...
使用JDBC进行批处理 -
chenbo0928:
[url][/url][img][/img][*]引用 ...
Removing a detached instance -
mousepc:
gklovejava 写道Utility method to ...
eclipse中的get/set功能的一个bug -
gklovejava:
Utility method to take a string ...
eclipse中的get/set功能的一个bug
http://www.aqee.net/docs/stream/
stream.js 是一个很小、完全独立的Javascript类库,它为你提供了一个新的Javascript数据结构:streams.
- <script src='stream-min.js'></script>
下载 stream.js2Kb minified
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();
- }
我们有个简单的方法来实现这个: s.print()
将会打印出stream里的所有元素。
用它们还能做什么?
另一个简便的功能是 Stream.range( min, max )
函数。它会返回一个包含有从 min
到 max
的自然数的stream。
- var s = Stream.range( 10, 20 );
- s.print(); // prints the numbers from 10 to 20
在这个stream上,你可以使用 map
, filter
, 和 walk
等功能。 s.map( f )
接受一个参数 f
,它是一个函数, stream里的所有元素都将会被f
处理一遍;它的返回值是经过这个函数处理过的stream。所以,举个例子,你可以用它来完成让你的 stream 里的数字翻倍的功能:
- function doubleNumber( x ) {
- return 2 * x;
- }
- var numbers = Stream.range( 10, 15 );
- numbers.print(); // prints 10, 11, 12, 13, 14, 15
- var doubles = numbers.map( doubleNumber );
- doubles.print(); // prints 20, 22, 24, 26, 28, 30
很酷,不是吗?相似的, s.filter( f )
也接受一个参数f
,是一个函数,stream里的所有元素都将经过这个函数处理;它的返回值也是个stream,但只包含能让f
函数返回true
的元素。所以,你可以用它来过滤到你的stream里某些特定的元素。让我们来用这个方法在之前的stream基础上构建一个只包含奇数的新stream:
- function checkIfOdd( x ) {
- if ( x % 2 == 0 ) {
- // even number
- return false;
- }
- else {
- // odd number
- return true;
- }
- }
- var numbers = Stream.range( 10, 15 );
- numbers.print(); // prints 10, 11, 12, 13, 14, 15
- var onlyOdds = numbers.filter( checkIfOdd );
- onlyOdds.print(); // prints 11, 13, 15
很有效,不是吗?最后的一个s.walk( f )
方法,也是接受一个参数f
,是一个函数,stream里的所有元素都要经过这个函数处理,但它并不会对这个stream做任何的影响。我们打印stream里所有元素的想法有了新的实现方法:
- function printItem( x ) {
- console.log( 'The element is: ' + x );
- }
- var numbers = Stream.range( 10, 12 );
- // prints:
- // The element is: 10
- // The element is: 11
- // The element is: 12
- numbers.walk( printItem );
还有一个很有用的函数: s.take( n )
,它返回的stream只包含原始stream里第前n个元素。当用来截取stream时,这很有用:
- var numbers = Stream.range( 10, 100 ); // numbers 10...100
- var fewerNumbers = numbers.take( 10 ); // numbers 10...19
- fewerNumbers.print();
另外一些有用的东西:s.scale( factor )
会用factor(因子)乘以stream里的所有元素; s.add( t )
会让 stream s
每个元素和stream t
里对应的元素相加,返回的是相加后的结果。让我们来看几个例子:
- var numbers = Stream.range( 1, 3 );
- var multiplesOfTen = numbers.scale( 10 );
- multiplesOfTen.print(); // prints 10, 20, 30
- numbers.add( multiplesOfTen ).print(); // prints 11, 22, 33
尽管我们目前看到的都是对数字进行操作,但stream里可以装载任何的东西:字符串,布尔值,函数,对象;甚至其它的数组或stream。然而,请注意一定,stream里不能装载一些特殊的值:null
和 undefined
。
想我展示你的魔力!
现在,让我们来处理无穷多。你不需要往stream添加无穷多的元素。例如,在Stream.range( low, high )
这个方法中,你可以忽略掉它的第二个参数,写成 Stream.range( low )
, 这种情况下,数据没有了上限,于是这个stream里就装载了所有从 low 到无穷大的自然数。你也可以把low
参数也忽略掉,这个参数的缺省值是1
。这种情况中,Stream.range()
返回的是所有的自然数。
这需要用上你无穷多的内存/时间/处理能力吗?
不,不会。这是最精彩的部分。你可以运行这些代码,它们跑的非常快,就像一个普通的数组。下面是一个打印从 1 到 10 的例子:
- var naturalNumbers = Stream.range(); // returns the stream containing all natural numbers from 1 and up
- var oneToTen = naturalNumbers.take( 10 ); // returns the stream containing the numbers 1...10
- oneToTen.print();
你在骗人
是的,我在骗人。关键是你可以把这些结构想成无穷大,这就引入了一种新的编程范式,一种致力于简洁的代码,让你的代码比通常的命令式编程更容易理解、更贴近自然数学的编程范式。这个Javascript类库本身就很短小;它是按照这种编程范式设计出来的。让我们来多用一用它;我们构造两个stream,分别装载所有的奇数和所有的偶数。
- var naturalNumbers = Stream.range(); // naturalNumbers is now 1, 2, 3, ...
- var evenNumbers = naturalNumbers.map( function ( x ) {
- return 2 * x;
- } ); // evenNumbers is now 2, 4, 6, ...
- var oddNumbers = naturalNumbers.filter( function ( x ) {
- return x % 2 != 0;
- } ); // oddNumbers is now 1, 3, 5, ...
- evenNumbers.take( 3 ).print(); // prints 2, 4, 6
- oddNumbers.take( 3 ).print(); // prints 1, 3, 5
很酷,不是吗?我没说大话,stream比数组的功能更强大。现在,请容忍我几分钟,让我来多介绍一点关于stream的事情。你可以使用 new Stream()
来创建一个空的stream,用 new Stream( head, functionReturningTail )
来创建一个非空的stream。对于这个非空的stream,你传入的第一个参数成为这个stream的头元素,而第二个参数是一个函数,它返回stream的尾部(一个包含有余下所有元素的stream),很可能是一个空的stream。困惑吗?让我们来看一个例子:
- var s = new Stream( 10, function () {
- return new Stream();
- } );
- // the head of the s stream is 10; the tail of the s stream is the empty stream
- s.print(); // prints 10
- var t = new Stream( 10, function () {
- return new Stream( 20, function () {
- return new Stream( 30, function () {
- return new Stream();
- } );
- } );
- } );
- // the head of the t stream is 10; its tail has a head which is 20 and a tail which
- // has a head which is 30 and a tail which is the empty stream.
- t.print(); // prints 10, 20, 30
没事找事吗?直接用Stream.make( 10, 20, 30 )
就可以做这个。但是,请注意,这种方式我们可以轻松的构建我们的无穷大stream。让我们来做一个能够无穷无尽的stream:
- function ones() {
- return new Stream(
- // the first element of the stream of ones is 1...
- 1,
- // and the rest of the elements of this stream are given by calling the function ones() (this same function!)
- ones
- );
- }
- var s = ones(); // now s contains 1, 1, 1, 1, ...
- s.take( 3 ).print(); // prints 1, 1, 1
请注意,如果你在一个无限大的stream上使用 s.print()
,它会无休无止的打印下去,最终耗尽你的内存。所以,你最好在使用s.print()
前先s.take( n )
。在一个无穷大的stream上使用s.length()
也是无意义的,所有,不要做这些操作;它会导致一个无尽的循环(试图到达一个无尽的stream的尽头)。但是对于无穷大stream,你可以使用s.map( f )
和 s.filter( f )
。然而,s.walk( f )
对于无穷大stream也是不好用。所有,有些事情你要记住; 对于无穷大的stream,一定要使用s.take( n )
取出有限的部分。
让我们看看能不能做一些更有趣的事情。还有一个有趣的能创建包含自然数的stream方式:
- function ones() {
- return new Stream( 1, ones );
- }
- function naturalNumbers() {
- return new Stream(
- // the natural numbers are the stream whose first element is 1...
- 1,
- function () {
- // and the rest are the natural numbers all incremented by one
- // which is obtained by adding the stream of natural numbers...
- // 1, 2, 3, 4, 5, ...
- // to the infinite stream of ones...
- // 1, 1, 1, 1, 1, ...
- // yielding...
- // 2, 3, 4, 5, 6, ...
- // which indeed are the REST of the natural numbers after one
- return ones().add( naturalNumbers() );
- }
- );
- }
- naturalNumbers().take( 5 ).print(); // prints 1, 2, 3, 4, 5
细心的读者会发现为什么新构造的stream的第二参数是一个返回尾部的函数、而不是尾部本身的原因了。这种方式可以通过延迟尾部截取的操作来防止进行进入无穷尽的执行周期。
让我们来看一个更复杂的例子。下面的是给读者留下的一个练习,请指出下面这段代码是做什么的?
- function sieve( s ) {
- var h = s.head();
- return new Stream( h, function () {
- return sieve( s.tail().filter( function( x ) {
- return x % h != 0;
- } ) );
- } );
- }
- sieve( Stream.range( 2 ) ).take( 10 ).print();
请一定要花些时间能清楚这段代码的用途。除非有函数式编程经验,大多数的程序员都会发现这段代码很难理解,所以,如果你不能立刻看出来,不要觉得沮丧。给你一点提示:找出被打印的stream的头元素是什么。然后找出第二个元素是什么(余下的元素的头元素);然后第三个元素,然后第四个。这个函数的名称也能给你一些提示。如果你对这种难题感兴趣,这儿还有一些。
如果你真的想不出这段代码是做什么的,你就运行一下它,自己看一看!这样你就很容易理解它是怎么做的了。
- stream-min.zip (1015 Bytes)
- 下载次数: 1
发表评论
-
Javascript编程风格
2012-07-28 22:43 826http://www.ruanyifeng.com/blog/ ... -
display:none与visible:hidden的区别
2012-02-27 12:08 1320http://www.cnblogs.com/nicholas ... -
javascript字符串操作
2012-02-09 18:37 995转自:沉积如水 使用 substring()或者sli ... -
用JavaScript隐藏控件的方法
2012-01-05 11:55 625转 http://blog.csdn.net/proglove ... -
令人厌烦的单引号和双引号
2011-11-14 12:14 690有时候我们需要在javascript中添加很多单引号 ... -
常用javascript函数,总结中
2011-11-09 11:01 649//去回车符 function rep ... -
select和option操作
2011-10-28 17:57 971http://www.jb51.net/article/162 ... -
css笔记
2011-10-01 15:00 961样式表定义及引用 1 ... -
JavaScript Minifier failed for
2011-09-23 19:32 1604JavaScript Minifier failed f ... -
javascript 正则表达式探索
2012-02-11 15:39 1080以下部分内容来自http://www.w3school.com ... -
给struts 的标签s:url加参数
2011-09-05 09:34 935有时候我们需要通过javascript来执行一些action。 ... -
为eclipse安装aptana 插件
2011-09-04 00:01 5074在网上找的links方式安装不成功,试了几次。没办法。只有在线 ... -
checkbox为null
2011-08-31 22:23 1233今天遇到一个小问题,新增操作时,checkbox提交到stru ... -
javascript DOM(五)----插入、删除节点
2011-08-28 17:01 4316插入节点: 1). insertBefore(): ... -
javascript DOM(四)----节点替换
2011-08-28 00:00 1137节点的替换: 1). replaceChild(): ... -
javascript DOM(三)
2011-08-27 23:19 910三个练习: 1. <html> ... -
javascript DOM(二)
2011-08-27 22:52 7268. 创建一个元素节点: 1). createEle ... -
javascript DOM(一)
2011-08-27 21:10 1161DOM:Document Object Model(文本对象模 ... -
javascript 表单重置的问题 reset
2011-08-22 11:30 3211今天做了一个reset按钮。但是还是有一个问题没有解 ... -
Javascript继承机制的设计思想
2011-06-07 08:33 714原文地址: http://www.ruanyifeng. ...
相关推荐
内容概要:本文主要探讨了SNS单模无芯光纤的仿真分析及其在通信和传感领域的应用潜力。首先介绍了模间干涉仿真的重要性,利用Rsoft beamprop模块模拟不同模式光在光纤中的传播情况,进而分析光纤的传输性能和模式特性。接着讨论了光纤传输特性的仿真,包括损耗、色散和模式耦合等参数的评估。随后,文章分析了光纤的结构特性,如折射率分布、包层和纤芯直径对性能的影响,并探讨了镀膜技术对光纤性能的提升作用。最后,进行了变形仿真分析,研究外部因素导致的光纤变形对其性能的影响。通过这些分析,为优化光纤设计提供了理论依据。 适合人群:从事光纤通信、光学工程及相关领域的研究人员和技术人员。 使用场景及目标:适用于需要深入了解SNS单模无芯光纤特性和优化设计的研究项目,旨在提高光纤性能并拓展其应用场景。 其他说明:本文不仅提供了详细的仿真方法和技术细节,还对未来的发展方向进行了展望,强调了SNS单模无芯光纤在未来通信和传感领域的重要地位。
发那科USM通讯程序socket-set
嵌入式八股文面试题库资料知识宝典-WIFI.zip
源码与image
内容概要:本文详细探讨了物流行业中路径规划与车辆路径优化(VRP)的问题,特别是针对冷链物流、带时间窗的车辆路径优化(VRPTW)、考虑充电桩的车辆路径优化(EVRP)以及多配送中心情况下的路径优化。文中不仅介绍了遗传算法、蚁群算法、粒子群算法等多种优化算法的理论背景,还提供了完整的MATLAB代码及注释,帮助读者理解这些算法的具体实现。此外,文章还讨论了如何通过MATLAB处理大量数据和复杂计算,以得出最优的路径方案。 适合人群:从事物流行业的研究人员和技术人员,尤其是对路径优化感兴趣的开发者和工程师。 使用场景及目标:适用于需要优化车辆路径的企业和个人,旨在提高配送效率、降低成本、确保按时交付货物。通过学习本文提供的算法和代码,读者可以在实际工作中应用这些优化方法,提升物流系统的性能。 其他说明:为了更好地理解和应用这些算法,建议读者参考相关文献和教程进行深入学习。同时,实际应用中还需根据具体情况进行参数调整和优化。
嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_8.doc.zip
内容概要:本文介绍了基于灰狼优化算法(GWO)的城市路径规划优化问题(TSP),并通过Matlab实现了该算法。文章详细解释了GWO算法的工作原理,包括寻找猎物、围捕猎物和攻击猎物三个阶段,并提供了具体的代码示例。通过不断迭代优化路径,最终得到最优的城市路径规划方案。与传统TSP求解方法相比,GWO算法具有更好的全局搜索能力和较快的收敛速度,适用于复杂的城市环境。尽管如此,算法在面对大量城市节点时仍面临运算时间和参数设置的挑战。 适合人群:对路径规划、优化算法感兴趣的科研人员、学生以及从事交通规划的专业人士。 使用场景及目标:①研究和开发高效的路径规划算法;②优化城市交通系统,提升出行效率;③探索人工智能在交通领域的应用。 其他说明:文中提到的代码可以作为学习和研究的基础,但实际应用中需要根据具体情况调整算法参数和优化策略。
嵌入式八股文面试题库资料知识宝典-Intel3.zip
嵌入式八股文面试题库资料知识宝典-2019京东C++.zip
嵌入式八股文面试题库资料知识宝典-北京光桥科技有限公司面试题.zip
内容概要:本文详细探讨了十字形声子晶体的能带结构和传输特性。首先介绍了声子晶体作为新型周期性结构在物理学和工程学中的重要地位,特别是十字形声子晶体的独特结构特点。接着从散射体的形状、大小、排列周期等方面分析了其对能带结构的影响,并通过理论计算和仿真获得了能带图。随后讨论了十字形声子晶体的传输特性,即它对声波的调控能力,包括传播速度、模式和能量分布的变化。最后通过大量实验和仿真验证了理论分析的正确性,并得出结论指出散射体的材料、形状和排列方式对其性能有重大影响。 适合人群:从事物理学、材料科学、声学等相关领域的研究人员和技术人员。 使用场景及目标:适用于希望深入了解声子晶体尤其是十字形声子晶体能带与传输特性的科研工作者,旨在为相关领域的创新和发展提供理论支持和技术指导。 其他说明:文中还对未来的研究方向进行了展望,强调了声子晶体在未来多个领域的潜在应用价值。
嵌入式系统开发_USB主机控制器_Arduino兼容开源硬件_基于Mega32U4和MAX3421E芯片的USB设备扩展开发板_支持多种USB外设接入与控制的通用型嵌入式开发平台_
e2b8a-main.zip
少儿编程scratch项目源代码文件案例素材-火柴人跑酷(2).zip
内容概要:本文详细介绍了HarmonyOS分布式远程启动子系统,该系统作为HarmonyOS的重要组成部分,旨在打破设备间的界限,实现跨设备无缝启动、智能设备选择和数据同步与连续性等功能。通过分布式软总线和分布式数据管理技术,它能够快速、稳定地实现设备间的通信和数据同步,为用户提供便捷的操作体验。文章还探讨了该系统在智能家居、智能办公和教育等领域的应用场景,展示了其在提升效率和用户体验方面的巨大潜力。最后,文章展望了该系统的未来发展,强调其在技术优化和应用场景拓展上的无限可能性。 适合人群:对HarmonyOS及其分布式技术感兴趣的用户、开发者和行业从业者。 使用场景及目标:①理解HarmonyOS分布式远程启动子系统的工作原理和技术细节;②探索该系统在智能家居、智能办公和教育等领域的具体应用场景;③了解该系统为开发者提供的开发优势和实践要点。 其他说明:本文不仅介绍了HarmonyOS分布式远程启动子系统的核心技术和应用场景,还展望了其未来的发展方向。通过阅读本文,用户可以全面了解该系统如何通过技术创新提升设备间的协同能力和用户体验,为智能生活带来新的变革。
嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_1.zip
少儿编程scratch项目源代码文件案例素材-激光反弹.zip
内容概要:本文详细介绍了COMSOL相控阵检测技术在有机玻璃斜楔上放置16阵元进行工件内部缺陷检测的方法。首先阐述了相控阵检测技术的基本原理,特别是通过控制各阵元的激发时间和相位来实现声波的聚焦和扫描。接着,重点解析了横孔缺陷的反射接收波,解释了波的折射现象及其背后的物理原因。最后,通过实例展示了COMSOL模拟声波传播过程的成功应用,验证了该技术的有效性和准确性。 适合人群:从事固体力学、无损检测领域的研究人员和技术人员,尤其是对相控阵检测技术和COMSOL仿真感兴趣的读者。 使用场景及目标:适用于需要精确检测工件内部缺陷的研究和工业应用场景,旨在提高检测精度和效率,确保产品质量和安全。 其他说明:文中提到的声速匹配现象有助于理解波在不同介质间的传播特性,这对优化检测参数设置有重要意义。
少儿编程scratch项目源代码文件案例素材-极速奔跑者.zip
嵌入式八股文面试题库资料知识宝典-微软_interview.zip