首页 > 代码库 > Scala学习笔记2 (带着问题学习, 逐渐扩展。理解吃透scala.)

Scala学习笔记2 (带着问题学习, 逐渐扩展。理解吃透scala.)

问题: 把 文本字符串"[1, 2, 3, 4, 5]" 转换成一个数组。 

答案:

val x = "[1, 2, 3, 4, 5]"

val y =x slice(1, x.length-1) replace(",","") split(" ")

var y1= x slice(1, x.length-1) replace(",","") split(" ") map(_.toInt)
y1: Array[Int] = Array(1, 2, 3, 4, 5)

或者写成

var y1= x.slice(1, x.length-1).replace(",","").split(" ").map(_.toInt)

或者

val y:Array[Int]= x slice(1, x.length-1) replace(",","") split(" ") map(_.toInt)

scala鼓励程序员用val声明变量,val实际上是一个常量,无法修改内容。 var声明变量, 可以修改。 

不需要给出值或者变量的类型, 因为类型可以从初始化, 或者赋值的表达式里推断出来。 

如果指定值或者变量的类型,会执行类型检查, 要求赋值表达式两边的类型要匹配。 例如下面的例子, 赋值会失败,因为类型不匹配。

val y:Array[Int]= x slice(1, x.length-1) replace(",","") split(" ")
<console>:37: error: type mismatch;
found : Array[String]
required: Array[Int]
val y:Array[Int]= x slice(1, x.length-1) replace(",","") split(" ")

类型转换问题:

以上对数组进行类型转换用的是map(_.toInt)

对单个字符串转换的例子是 “1”.toInt, 这里toInt不用加括号。 

有意思的是数字转成字符串的时候,1.toString,  1.toString()都是可以的.

 在scala中, 类型转化用的都是方法, 而不是强制类型转换.  

Int 转成Long 是使用 testInt.toLong而不可以像C++和jaiva里用到的(Long)testInt

关于函数调用问题:

上面例子里 x.slice(1, x.length-1), 也可以用 x slice(1, x.length-1)

scala里调用一个函数可以用

a 方法 b

也可以用

a.方法(b)   用.来引用方法的时候, 必须用括号

还可以

a 方法(b)用空格来引用方法的时候, 且如果只有一个参数,不一定用括号。 上面的写法还可以是

val y =x slice(1, x.length-1) replace(",","") split " "

如果是么有参数的函数, 调用的时候不需要加() , 例如 1.toString()

和java不一样, scala支持重写运算符。 scala有一个伴生对象apply方法, 是不需要显示的写出函数名的。 它是Scala中构建对象的常用方法。 例如

Array(1,4,5,16)返回一个数组用的就是Array伴生对象的apply方法, 看上去类似于构造函数, 但其实不完全是。 

再比如"Hello"(4)返回‘o’, 实际上是在调用StringOps类中的def apply(n:Int): Char 方法。 

 

 

 

 

Scala学习笔记2 (带着问题学习, 逐渐扩展。理解吃透scala.)