Scala确是一门神奇的语言,从语言特性上来说远比Java、Python更加学院派,Martin大大作为一名教授,使得每个Scala新的特性大多会有一篇博士论文作为支持,不像Python,只有一个PEP提案。看来语言的发明者是教授确实好处很多,但是带来的坏处也不言而喻,曲高而和寡,叫好而不叫座。例如扎根Scala里的函数式编程思想,使用val表示不变量还好理解,高阶函数和惰性求值也还好,稍微思考下也能勉强理解能用了,monoid是什么鬼?可应用和可遍历的函子又是啥?相信读者大部分也一脸迷糊了。这就是Scala,用Scala写Java的程序也还好,毕竟Scala兼容Java,允许程序员龟缩在自己的一亩三分地,抱怨着“学不动了”,更甚者,作为一个允许在Jvm上的,静态类型的编译语言,Scala也能让你写出Python的感觉。
不行?你可以试着在文本编辑器写上:
代码语言:javascript复制println("Hello, Scala!")
保存为hello.scala,再运行Scala hello.scala,屏幕上出现了Hello, Scala! 吃惊吗?(当然这个得益于Scala强大的类型推导机制和解释器)。
所以说Scala是一门有趣的语言,无论是动态语言还是静态语言,总能找的到你熟悉的角落。
倘若Spark和Kafka不火起来的话,Scala可能也就会和Matlab一样,流行于学术界。但生活是一件很奇妙的事,Spark从伯克利成长起来,这也多亏于MapReduce,Hadoop开创了大数据时代,但是MapReduce作为Hadoop的发家手段被Spark逐渐取代了。在Spark的代码里,充斥着Scala的设计思想,RDD是不变的,于是自然而然引入了map、reduce、fliter等高阶函数,甚至在SparkSQL里,SQL的parser也是使用了Scala的模式匹配,简洁而优雅。Spark源码
于是Scala随着Spark和Kafka的成长,慢慢地也走进了工业界的视野。虽然Spark提供了良好的Python和Java接口,Kafka本身也拥有着自己的二进制协议,开发者不可能只使用接口吧,遇到什么大问题,总得捏着鼻子阅读Spark和Kafka的源码?就这样,Scala伴随着大数据的浪潮也有了人使用和关注。
一旦开始使用Scala,Java的开发者应该会有种很不适用的感觉,例如在Java里变量的初始化必须要指明类型:
代码语言:javascript复制String msg = "Hello, World!"
但是Scala觉得这个没啥必要,编译器可以做的事,何必需要开发者呢?开发者唯一需要关注的只是这个变量是可变的还是不变的。
代码语言:javascript复制val msg = "Hello, World!"
在Java里,for循环可能要写一大堆,args是一个列表:
代码语言:javascript复制for(i=0;i<args.size();i ){
System.out.println(args.get(i))
}
Scala可能就一行代码。
代码语言:javascript复制args.foreach(println)
在一定程度上,写过了Scala的代码,再转回Java(即使是Python)大多会有种深深的不适应感,到后来逐渐地被Scala带偏,原来编程语言还可以这么写,Java(Python)设计的这里不好,那里不好。
总的来说,Scala是一门优秀的语言(不代表适合工业界),里面充斥着学术界对编程语言未来的思考,值得花费精力去学习,不仅仅是学习Scala的语法,也要学习隐藏在Scala背后的观念,学习Scala是如何思考编程这门手艺的。
--以此作为《Scala学习》系列的开篇