Scala学习心得

简介:

之前用了一段时间Grails,收获良多。但是同时也接触到了Scala,当时只是看了下特性,与Groovy对比一下,感觉确实优点很多。最近正好不忙,就抽空看了下,现在觉得这门语言实在太棒了。原先感觉Groovy可以给java做很好的补充,特别是Grails框架给Web开发带来了很多便利。现在感觉Scala确实有实力替代java,做底层开发用Scala会更好,做Web也可以使用Lift框架。


先说说缺点,我从一个java程序员的角度来谈谈:
1. 有一定的学习成本。虽然Scala也是基于jvm的,但是他的语法和java有不少出入,要适应这些语法就需要时间了。而且这个是函数式编程等一些java没有的特性,这就导致很多编程思想从根本上不一样,也需要转变一下。比如没有continue和break,这个是命令式编程才有的,写Scala要换换了。

2. 与java的互操作性不如Groovy。这点主要是由于引入了太多新的理念,这些都是java中没有的,因此java回调Scala会比较麻烦。好在Scala调用java比较容易,所以主体代码用Scala写,这样还能很随意的调用java的包。

3. 启动速度较慢。虽然Scala也提供shell方式运行,也能用脚本方式直接编译运行*.scala的程序,但是和python比,都要慢。这主要是慢在启动和编译的速度上,还好执行效率还是很高的,但是做脚本来用,总是有那么一点点不爽。

4. IDE功能还有待加强。Eclipse设计还真是差强人意,插件支持一直都不是那么好,做Grails和Scala都发现有很多以前做java开发常用的功能都会出问题。这也造成很大的不便,希望能早日改进。

5. String操作还是不够理想,为什么就不能像python3那样操作string呢。还好有%s这样的占位符,但是不能给占位符命名,看上去还是不够直观。用+的方式感觉是相当难看,复制出去还要改N多东西。另外bean的定义还是很喜欢Groovy的方式,像new bean{ name:"myName" },那个写出来感觉很直观,顺序也可以随意点,特别是参数很多的时候。难道是因为DRY原则没有这么做吗?

上面很多都是我个人的牢骚了,这些缺点基本都是可以接受的。特别是如果你接受了Scala的新理念,这些都是会有更好的编程实践,所以这个投入还是很值得的。

说说优点吧,如果这些优点正是你寻找的特性,那么Scala真的是很不错的选择。
1. 多线程并发编程的Actor模型。这个是最吸引我的特性,他与Erlang类似,解决了多线程时资源竞争问题,这样你就可以少了很多不得不仔细考虑还容易出错事情。java7里面的Fork/Join模型也不错,但是还是基于内存共享的方式,还是有潜在的问题。Actor模型不一样,他是不共享内存资源的,可变的内容只能是private的。这从根本上解决了资源竞争问题。但是如果有可变内容,其实还是串行执行的,但是Actor还是利用了多核的优势,具体执行任务的核是由调度器分配的,这也是没花什么力气就用上了多核。多么美妙的事情!

2. 简洁的函数式编程与闭包。其实我对这个编程方式理解还不深入,但是他简洁优美的代码却已经深深吸引了我。这种编程方式是让你能更专注于实现,而不是细节,而且Curry化让函数更优美。比如让一个List[Int]里面的值都乘以2,想想java那恶心的for循环吧,貌似我们很多地方都要用for循环去干这些简单的事情,Scala中我们这样做list map { i => i*2 },或者简写成list map ( _ * 2 )。是不是异常优美?

3. 静态类型与动态声明。我最不喜欢动态语言的地方就是类型都是在运行的时候才会被推演,如果代码中类型弄错了,不执行那句话,你是不会知道错误的。但是静态类型在编译阶段就会检查这个问题,而且编译时类型就定下来了,效率也明显提升。但是def、var方式的类型声明确实很方便,这个比java这种一个个声明爽多了,而且默认都是public,也省了很多废话。特别Scala推崇不变性,而利用val就直接可以声明,用起来也很方便。另外,提供了Option类型来替代了可能返回的null,这比Groovy重写了if方式(用if(bean)来表示if(bean!=null))高明多了,null是程序出错最多的情况了,很多情况的exception还不得不返回一个new Bean()这样一个空对象来避免这个问题。

4. Scala的Collection。用他的List、Map、Set有很多函数式操作的方法,特别是foldeLeft、map、filter、mkString、toXXX,用起来优美简单,相当有爱!

5. 强大的模式匹配。一直感觉if语句非常恶心,但是java的switch语句限制又太多,冥冥中感觉就应该有这样强的pattern matching才是最好的。Scala提供给我们一个非常强大、易用的case方式,再加上对正则表达式的简化,太好用了。想想之前写代码,还一直用自己写的正则表达式封装库,这下有更好的替代品了。

6. 方便的bean定义。java的bean定义应该是原始社会的产物了,一堆堆的getter和setter,如果没有IDE,我估计每个人都会崩溃的。Grails里面的定义很漂亮,里面的mapping和constraints可以把数据库和前台的页面都挂上,非常非常棒!Scala也省去了那些无聊的getter和setter,用var或者val去声明,貌似Groovy没有不变量val的声明。至于Web方面的Lift框架,我还没研究过。反正都比java强!

7. 不强制catch Exception。这个非常好,再也不用为了Thread.sleep(1)这样的代码写catch了,自动向上抛异常。但是你不会忘了需要catch的exception吧?

8. Trait。这个我不知道怎么评价了,说到设计模式,应该是针对接口编程的。但是Trait里面混入了实现,貌似不是更好的实践。但是用起来确实方便,特别是可以混入多个trait,在new的时候可以临时引入,虽然我很喜欢这样,但是会不会陷入针对实现编程的圈圈里面呢?还请高人指点!

9. 方便的io操作。目前新兴语言基本都提供这个,java重写的nio虽然性能上去了,但是api用起来还是要写很长代码。特别可以直接对XML操作,这个和Groovy一样了,都是很大的进步啊。看到java那几种解析XML的包,也每个统一方式,用起来也没原生支持爽。但是唯一可惜的就是不能像python那样对url下载这类的操作,可能是有了HttpClient,他也不再重复造轮子了吧。

10. scalatest。比JUnit提供更多方面的函数,而且也可以用JUnit去运行他,相当方便。但是有点非常遗憾,我特别喜欢用test函数来写测试,又漂亮又清楚。但是这样貌似就不能用JUnit去调用了,而公司要求生成报告,只能用JUnit了。不知道Scalatest有没有生成报告的功能啊。

       不知不觉写了挺多的,真的很喜欢Scala,而且我也打算用Scala来代替java了。java7还在制作中,但是如此多的特性估计java背上兼容性的包袱,也很难有很大突破。编写前台的话可以考虑研究Lift框架,或者用Scala+Spring+ibatis,但是如果写后台,我都找不到拒绝Scala的理由了。
       如果你对Scala也有兴趣,欢迎一起研究~!

本文转自passover 51CTO博客,原文链接:http://blog.51cto.com/passover/425456,如需转载请自行联系原作者

相关文章
|
13天前
|
分布式计算 大数据 Java
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
30 5
|
13天前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
38 3
|
5月前
|
Scala 容器
Scala学习--day04--集合、常用方法、案例实操 - WordCount TopN、不同省份的商品点击排行
Scala学习--day04--集合、常用方法、案例实操 - WordCount TopN、不同省份的商品点击排行
104 2
|
5月前
|
消息中间件 分布式计算 大数据
Scala学习--day03--函数式编程
Scala学习--day03--函数式编程
|
5月前
|
Java Scala
Scala学习--day02---控制流、“九层妖塔—杨辉三角”
Scala学习--day02---控制流、“九层妖塔—杨辉三角”
175 1
|
5月前
|
Java 编译器 API
Scala学习--day01变量与数据类型、运算符
Scala学习--day01变量与数据类型、运算符
|
存储 算法 Java
Scala学习三-面向对象
前面我们已经学习了特质类似接口,其可以被继承,同时如果需要继承多个特质的话,则需要使用extends…with…进行继承。其类似java中的接口和抽象方法的结合体,但又比java中的其要强大,因为其可以定义抽象字段和普通字段、抽象方法和普通方法。而在java中接口中可以定义常量,不能定义变量。同时特质还可以继承class类,而在java中接口通常是用来实现的。 Object继承trait
134 0
Scala学习三-面向对象
|
Java Scala
Scala学习一
Scala中的方法与函数: 方法是属于类或者对象的,在运行时,它是加载到JVM的方法区中,而函数则是加载到JVM的堆内存中,同时可以将函数对象赋值给一个变量。函数是一个对象,继承自FunctionN,函数对象有apply、curried、toSting、tupled这些方法,而方法则没有。这是scala与java不同的地方。
95 0
Scala学习一
|
分布式计算 资源调度 Hadoop
基于mac构建大数据伪分布式学习环境(七)-部署Scala及Spark学习环境
本文主要讲解如何部署Scala与单机伪分布式Spark计算引擎
114 0