29Sep/110
Scala和Java的互操作
最近在实践中遇到一些Scala和Java互操作的问题,记录一下
BTW: gist + wordpress的gist插件各种好使啊 果断抛弃各种syntax highlighter插件
Scala Map Java Map
下面代码是两个隐式转换,用于在两者之间互转
Scala repeated parameters Java varargs
不好好看书就急着动手的杯具……纠结了很久才知道如何正确调用可变参数列表的Java方法
如果不使用: _*这个annotation告诉scala我要展开成varargs,不论你如果toArray如果反射new出Object数组都是没有用的,整个Array或者List会被作为一个Object传入,而不是展开成多个参数传入调用方法
20Sep/112
来scala下Scala
Scala,所谓可伸缩可扩展,于是就蛋疼试试
首先因为scala的语句块都可以返回值,因此if else完全可以取代?:三元运算符的作用,不过写起来还是后者比较爽。那就自己扩展一把好了。
class BooleanEx(b: Boolean) {
def ?[T](func: Boolean => T) = {
func(b)
}
}
class AnyEx[T](o: T) {
def or(o1: T) = { b: Boolean =>
if (b) {
o
} else {
o1
}
}
}
object Helper {
implicit def Boolean2BooleanEx(b: Boolean) = new BooleanEx(b)
implicit def Any2AnyEx[T](o: T) = new AnyEx(o)
def main(args: Array[String]) {
(1 == 1) ? (true or false)
}
}
无奈的地方是没法使用冒号作为方法名(因为是关键字),以及?属于最高优先级层,所以后面的括号省略不能……
17Aug/104
Scala笔记2
最近几天杂事很多,导致那本薄薄的Scala至今未看完……今天先来接一下Scala笔记2
- Scala的访问控制机制和Java有别。有些许的概念不同而且能够做到更加细粒度的控制。Scala默认访问修饰为public,Java则是微妙的default。Scala中的protected则比Java更小气,它只对自己和派生类可见,同包下的其它类无法访问,而且类也只能访问自己的基类中的protected成员,无法访问继承同样基类的其余派生类中的基类protected成员。Scala对细粒度访问控制体现在private和protected修饰可以通过方括号指定额外的报名或类名来赋权。
11Aug/102
Scala笔记1
最近在看Scala,把笔记贴过来存档。
- Scala基于JVM,通过scalac编译成JVM字节码。不同于Groovy(同样是跑在JVM上),Scala是静态类型的,因此可以支持泛型和多态等特性。Scala完全使用自己的规则创建,因此相对于Groovy来说学习成本更高(Groovy其实就是Java的强化?简化?版)。而且因为基于JVM,因此可以很好的和现有Java项目整合,在Scala中可以直接使用Java现成的无数类库。
- Scala通过var和val定义变量。var定义可变量,val定义不可变量,类似Java中的final,一旦初始化赋值后就无法改变。Scala鼓励尽可能的使用val让类和方法获取原生的线程安全性,同时通过val和闭包(方法对象)的使用来支持函数式编程。当然Scala也可以使用Java抠腚们熟悉的命令式来书写。
- 既然Scala支持FP,因此它确实支持尾递归优化。只不过受制于JVM,只能做到简单的尾递归优化,在比较复杂的情况下无法确实优化。下面的代码清单是一个尾递归的例子,递归了一亿次,一切正常。
object Main { def main(args: Array[String]): Unit = { println(doSum(100000000L, 0)) } def doSum(n: Long, sum: Long): Long = { if (n == 0L) { sum } else { doSum(n - 1, sum + n) } } }