首页 > 代码库 > scala 学习笔记

scala 学习笔记

1.简洁

1.1。java的写法

class MyClass {      private int index;      private String name;      public MyClass(int index, String name) {          this.index = index;          this.name = name;      }  } 

 

1.2。scala的写法:写起来更快,读起来更容易,重要的是更不容易犯错

class MyClass(index: Int, name: String) 

 

2.更灵活,更抽象

假设你有一个String变量name,你想弄清楚是否String包含一个大写字符。

2.1。 java的写法

boolean nameHasUpperCase = false;  for (int i = 0; i < name.length(); ++i) {   if (Character.isUpperCase(name.charAt(i))) {    nameHasUpperCase = true;    break;   }  } 

 

或者更近一步:面向接口编程

interface CharacterProperty {   boolean hasProperty(char ch);  }  

实现exists(String name, CharacterProperty property)方法

exists(name, new CharacterProperty {   boolean hasProperty(char ch) {    return Character.isUpperCase(ch);   }  }); 

 

2.2。scala的写法

val nameHasUpperCase = name.exists(_.isUpper) 

 

3.类型推断

3.1

java的static方法无法访问泛型类的类型参数,所以static方法需要使用泛型能力,就必须使其成为泛型方法。

3.2

val x = new HashMap[Int, String]()  val x: Map[Int, String] = new HashMap()  

或者:

class Complex(real: Double, imaginary: Double) {    def re() = real    def im() = imaginary}

需要注意的是,这两个方法的返回值都没有显式定义。在编译过程中,编译器可以根据函数的定义来推断出:两个函数的返回值都是Double类型。

其他:

scala> def id[T](x: T) = xid: [T](x: T)Tscala> val x = id(322)x: Int = 322scala> val x = id("hey")x: java.lang.String = heyscala> val x = id(Array(1,2,3,4))x: Array[Int] = Array(1, 2, 3, 4)

 

 

4.无参方法

Complex 类中的re 和im 方法有个小问题,那就是调用这两个方法时,需要在方法名后面跟上一对空括号,就像下面的例子一样:

object ComplexNumbers {  def main(args: Array[String]) {    val c= new Complex(1.2, 3.4)    println("imaginary part: " + c.im())  }}

如果能够省掉这些方法后面的空括号,就像访问类属性一样访问类的方法,则程序会更加简洁。这在Scala 中是可行的。

 

class Complex(real: Double, imaginary: Double) {  def re = real  def im = imaginary}

 

 

scala 学习笔记