apply
先上代码,builder模式:
1 2 3 4 5 |
ApnsReqBuilder(deviceToken, msgTask.payload) .setExpiration(msgTask.expireTime.toString) .setTopic(msgTask.bundleId) .setId(apnsID) .build() |
scala初学者第一反大概object对象怎么能有构造参数,就算可以带参数那也应该在并发上有问题吧。
实际上是apply这个语法糖的作用:
1 2 3 4 5 6 |
object ApnsReqBuilder { def apply(deviceToken: String, payload: String) = new ApnsReqBuilder(deviceToken, payload) } class ApnsReqBuilder(deviceToken: String, payload: String) { .. } |
至于这么写有什么好处?其实我觉得没啥好处,除了看起来特别舒服。但代码就是写给人看的不是么,给机器看的那是0和1。掀桌!!
模式匹配
就不背书了,模式匹配相当强大,特别对于多个条件联合判断的时候,比如条件a/b/c,组合起来多达8种可能。若用if else写到最后肯定晕,这时候用模式匹配感觉代码会清晰很多。
1 2 3 4 |
(a,b,c) match { case (true, true, true) => // do something .. } |
par
对于费时的重复操作,若可以并行处理,可以简单的使用par:
1 2 3 4 5 6 7 8 |
(1 to promiseChannelSize - checkSize).par.foreach { _ => try { newChannel() } catch { case e: Exception => } } if(channels.size() == 0) throw new Exception("建立连接全部失败") |
函数即对象
函数即对象目前我感受最深的就是很多公共的代码可以更优雅的写出来了。比如对一段代码的运行时间开销进行记录:
1 2 3 4 5 6 |
def msCost[U](actionName: String)(action: => U): U = { val start = System.currentTimeMillis() val res = action println(s"[msCost] $actionName, ${System.currentTimeMillis() - start}") res } |
对于想查看时间开销的代码段,则:
1 2 3 |
msCost("segement name") { // some action } |
同样的功能用java实现起来则十分痛苦。
List
scala的list是以这样的形式存在的:a -> b -> c。当添加一个元素d时
1 2 3 4 5 |
var list = List(1,2,3) pool { process(list) } list ::= 4 |
不用像java中一样,进入线程中的变量都是final类型的。scala此处仅仅是多申请了一个“指针”,一个指向进入thread时的list元素,后续list操作还是原来的“指针”进行操作。
与java无缝集成
java中的集合可以方便的转换成scala的集合,反之亦然:
1 2 |
import scala.collection.JavaConverters._ private val cache = new ConcurrentHashMap[String, ApnsClient].asScala |
(转载本站文章请注明作者和出处 程序员的自我修养 – SelfUp.cn ,请勿用于任何商业用途)
博客不错,嘎嘎!
:?
haha~ very good~