问题: 把 文本字符串"[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 方法。