对函数式编程的很多想法,我还是认为很正确的。看过本关于erlang的书,立刻对其中的各个方面深有好感。比如不变性,actor模式,热更新,Pattern matching(忘了中文了)。但是,也深深地对函数式的思考方式感到,我勒个去。。。
对于scala,我首先还是通过play!framework听说的(顺便推荐下这个java web框架,比较有灵性)。后来知道写groovy的大哥说,要是哥早知道scala,就不写groovy了。这么有魅力的语言,趁着事情少(其实,学校里就是这点好。干什么事情,可以听自己的),多了解了解。用scala写了些机器人的程序,也写了写开源项目。感觉还是非常爽的。这个算是在python之后又一个让我觉得惊艳的语言了。
下面分条列举下我最喜欢的scala的几件事情吧~~如果你也喜欢,你可以尝试着用下scala
不用分号
well,和python,javascript一样。scala是不需要分号的。(但是和python不同,scala使用{}表示代码块)。虽然对于我这种ide党来说,分号都是自动补全的而且很容易看出来的问题。但是,没有分号还是一个非常好的特性。
类型推演
类型推演这个东西,其实并不算什么太牛逼的特性,C++和C#这种静态类型语言都是支持的(吐槽下java)。但是,这么老掉牙的东西,scala都有一个很牛逼的特点。
val f_in = new FileOutputStream(".\output") // val 表示常量var count = 1 // var 表示变量
常量变量,仅仅用一个字母就分清楚了。多简单~~想想操蛋C++吧,一个类型的变量就至少有四种。整形(int)来说,就有int,int&,const int, const int &。这还不算指针。scala这种玩法,简单,优雅,有效。
所有的操作都有返回值
好吧,scala是函数式语言,这个在函数式语言中并不是什么牛逼闪闪的特性,但是在OO为主的jvm和静态类型语言中,绝对牛逼闪闪了。这有什么用呢?看代码吧。。
String file_type = null;if(key.equals("flv")){ file_type = "flv";} else if (key.equals("hd2")) { file_type = "flv";} else if (key.equals("mp4")){ file_type = "mp4";}
这是个java代码示例。目的是将优酷的视频格式(标清,高清,超清)等等,转换成文件的扩展名。这只是其中一小段代码,为了给file_type赋值。可以看出来,下面的条件判断,和赋值距离较远。这还是比较简单的逻辑。如果条件判断力要做比较复杂的逻辑,就很难看出来这段代码是赋值的意思了。看看scala是怎么搞的吧~~
val file_type = if (key=="flv"||key=="hd2") { "flv"} else if (key=="mp4") { "mp4"} else { null}
一切就是这么自然而然。当然,这还不是最happy的过程,下一个h2说最和谐的玩法
Pattern matching
Pattern matching也可以说是函数式语言的特性吧。这在erlang里就是最基本的一种操作。如果简单的理解,可以理解成牛逼的switch{但实际上,除了传统的switch,还有很多地方可以用到Pattern matching}。
还是上面的问题,用pattern matching可以
val file_type= key match { case "flv"|"hd2" => "flv" case "mp4" => "mp4" case _ => null}
这样子就可以做到和刚才一样的效果了。值得注意的是,由于scala的每个statement都是有返回值的,所以,这个match的语句,也可以用在给函数传参上。
当然,scala好用的地方远不止这些,这仅仅是这个系列博客的第一节。在下一节,我将介绍scala比较好用的迭代器,Stream,lazy等。算是做个预告吧。。
:)顺便对我的wordpress博客做个推广
- 2楼godbreak昨天 13:19
- 感觉你JAVA和scala 都学的不好。那个你忘了的英文,中文标准翻译叫模式匹配。
- Re: kjjxx昨天 21:39
- 回复godbreakn怎么才能学好scala
- 1楼zalemwoo昨天 23:42
- 怎么上首页的,感觉是来搞笑的,初学编程的吧