Scala by Example: 第一个例子
来源:互联网 发布:阿里云支持子域名吗 编辑:程序博客网 时间:2024/04/29 18:19
1: // Java风格的代码
2: def oldSchoolSort(xs: Array[Int]) {
3: //Scala支持嵌套函数
4: def sort1(l: Int, r: Int) {
5: val pivot = xs((l + r) / 2)
6: var i = l
7: var j = r
8: while(i <= j) {
9: while(xs(i) < pivot) i += 1
10: while(xs(j) > pivot) j -= 1
11: if(i < j && xs(i) != xs(j)) swap(i, j)
12: if(i <= j) {
13: i += 1
14: j -= 1
15: }
16: }
17: if(l < j) sort1(l, j)
18: if(r > i) sort1(i, r)
19: }
20:
21: // Scala是种“面向表达式”的语言,每个函数都会返回值。如果没有东西可以返回,那么默认返回 ()
22: // () 属于Unit类。返回Unit的函数也被称为procedures。如果函数不是返回Unit,那么,函数体前
23: // 面必须加上 "="
24: def swap(i: Int, j: Int) {
25: val t = xs(i); xs(i) = xs(j); xs(j) = t
26: () // 可以省略,加上则明确表明返回Unit
27: }
28:
29: sort1(0, xs.length - 1)
30: }
31:
32: // 更具函数风格的sort,注意filter为“partially applied function”,即部分实现函数(有译作
33: // 偏应用函数的,不敢苟同),另外,pivot > 的完整形式为:x => pivot > x
34: def sort(xs: Array[Int]): Array[Int] = {
35: if(xs.length <= 1) xs else {
36: val pivot = xs(xs.length / 2)
37: Array.concat(sort(xs filter (pivot >)), xs filter (pivot ==),
38: sort(xs filter (pivot <)))
39: }
40: }
41:
42: val xs = Array(23, 3, 0, -3, 3, 12)
43: println(sort(xs).mkString(", "))
以上代码中的oldSchoolSort已经小小的修改了下,原书的例子有些小小的界桩错误,虽然不影响结果,但是却几乎降低了一半的效能。另外,说到效能,不能不提一下内存的问题。不像旧式风格的代码只是在原有的对象上进行修改,函数风格的代码(sort)会生成不变对象来进行传递,运行时需要临时占用更多的内存。
Scala by Example PDF下载,原书为Scala官网上的示例。
PS. 昨天在Groovy和Android项目上遇到的IDEA故障今天出现在了Scala上,我英明神武的断言此乃文件系统权限问题,并一举命中selinux。关闭Selinux后,一切恢复了和谐……
PS II. 和谐了没多久,发现Scala支持的配置机制有bug,遂将Scala运行时从Global级别降级到Project Level,顺利“绕过”问题。
PS III. 然后就发现ibus在IDEA中不断的丢失焦点……也就是说在IDEA里打中文从此只能“偶尔为之”。
PS IV. 最后想用Ctrl+Alt+L格式化代码,结果热键冲突,导致操作系统锁定,只好悲愤的重敲一遍十几位的密码……
Technorati 标签: Scala
- Scala by Example: 第一个例子
- 5、第一个例子
- opengl 第一个例子
- hibernate第一个例子
- ajax 第一个例子
- JavaBeans第一个例子
- SiteMesh第一个例子
- Mina第一个例子
- Hibernate---->第一个例子
- Servlet第一个例子
- struts2第一个例子
- struts2第一个例子
- zTree第一个例子
- AJAX 第一个例子
- Hibernate第一个例子
- Mybatis第一个例子
- Hibernate第一个例子
- OSGi第一个例子
- linux命令温故而知新:查看网络连接/端口
- 论网络学习资源的意义、功能与类型
- linux命令温故而知新:查看磁盘空间占用
- [转]ACM之java速成(转) 收藏
- VC++常用API
- Scala by Example: 第一个例子
- streams.h is not found
- TDD的一些思考
- 网络流量监控(局域网)
- [转]由经纬度计算Google卫星地图中瓦片Tile的地址
- 三言两语话Class.forName(xxx.xx.xx)
- 类scanf函数中%[*]type的巧用场景
- SPD (SMBUS)
- 初次见面