现在的位置: 首页 > 综合 > 正文

Scala的几件非常爽的事情 1

2014年02月22日 ⁄ 综合 ⁄ 共 1690字 ⁄ 字号 评论关闭

对函数式编程的很多想法,我还是认为很正确的。看过本关于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博客做个推广

抱歉!评论已关闭.