抠腚爱揉曼 Coding Iron Man

29Sep/110

Scala和Java的互操作

Posted by Anson

最近在实践中遇到一些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传入,而不是展开成多个参数传入调用方法

Tagged as: , No Comments
20Sep/112

来scala下Scala

Posted by Anson

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)
	}
}

无奈的地方是没法使用冒号作为方法名(因为是关键字),以及?属于最高优先级层,所以后面的括号省略不能……

Tagged as: 2 Comments
17Aug/104

Scala笔记2

Posted by Anson

最近几天杂事很多,导致那本薄薄的Scala至今未看完……今天先来接一下Scala笔记2

  • Scala的访问控制机制和Java有别。有些许的概念不同而且能够做到更加细粒度的控制。Scala默认访问修饰为public,Java则是微妙的default。Scala中的protected则比Java更小气,它只对自己和派生类可见,同包下的其它类无法访问,而且类也只能访问自己的基类中的protected成员,无法访问继承同样基类的其余派生类中的基类protected成员。Scala对细粒度访问控制体现在private和protected修饰可以通过方括号指定额外的报名或类名来赋权。
11Aug/102

Scala笔记1

Posted by Anson

最近在看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)
        }
      }
    }