您的位置:首页 > 其它

scala学习笔记

2015-12-21 20:29 302 查看
笔记基于http://blog.csdn.net/mapdigit/article/details/21878083总结,感谢引路蜂大神1-3讲Scala定义了两种类型的变量val和var,val类似于Java中的final变量,一旦初始化之后,不可以重新赋值Scala
可以根据赋值的内容推算出变量的类型:
val
msg
=
"Hello,World"
2
msg
:
String
=
Hello,World
与下面等效
val
msg
2
:
String
=
"Hello
again,world"
Scala语句也不需要以分号结尾如果在命令行中需要分多行输入,Scala解释器在新行前面显示“|”,表示该行接着上一行。比如查看源代码打印帮助
1
scala>
val
msg
3
=
2
|
"Hello
world3rdtime"
3
msg
3
:
String
=
Hello
world
3
rd
time
Scala既是面向对象的编程语言,也是面向函数的编程语言,因此函数在Scala语言中的地位和类是同等第一位的每个Scala函数都有返回值,只是有些返回值类型为Unit,类似为void类型每个Scala表达式都有返回结果(这一点和Java,C#等语言不同),比如Scala的
ifelse语句也是有返回值的,因此函数返回结果无需使用return语句。实际上在Scala代码应当尽量避免使用return语句。函数的最后一个表达式的值就可以作为函数的结果作为返回值Scala本身是设计用来编写大型应用的Scala不支持 ++i,i++
运算符,因此需要使用i+=1来加一Scala访问数组的语法是使用()而非[].如果一个函数只有一个参数并且只包含一个表达式,那么你无需明确指明参数:
args.foreach(arg
=
>
println(arg))=========args.foreach(println)==========
1
for
(arg
<-args)
2
println(arg)
lambda表达式
Scala使用方括号来指明数据类型参数,而非尖括号:
valgreetStrings=newArray[String](3)//等价于valgreetStrings=Array("Hello",",","World\n"),等价于valgreetStrings=Array.apply("Hello",",","World\n")
greetStrings(0)="Hello"
如果一个方法只有一个参数,你可以不用括号和.
来调用这个方法:for
[code](i
<-
0
to
2
)
print(greetStrings(i)),(0).to(2)
调用的为整数类型的to方法,to方法使用一个参数[/code]
Scala中所有的基本数据类型也是对象(和Java不同),因此0
可以有方法
1+2
,最终解释为(1).+(2)
在Scala中,当你在某个值后面使用()时,Scala将其翻译成对应对象的apply方法
如果对某个使用()的对象赋值,比如:
greetStrings(
0
)
=
"Hello",
Scala将这种赋值转换为该对象的update
方法,也就是greetStrings.update(0,”hello”).Scala也是一个面向函数的编程语言,面向函数的编程语言的一个特点是,调用某个方法不应该有任何副作用,参数一定,调用该方法后,返回一定的结果,而不会去修改程序的其它状态(副作用)数组的元素是可以被修改的。如果需要使用不可以修改的序列,Scala中提供了Lists类。和Java的List不同,Scala的Lists对象是不可修改的valoneTwo=List(1,2)valthreeFour=List(3,4)valoneTwoThreeFour=oneTwo:::threeFourprintln(oneTwo+"and"+threeFour+"werenotmutated.")
//List(1,2)andList(3,4)werenotmutated.
println("Thus,"+oneTwoThreeFour+"isanewlist")//Thus,List(1,2,3,4)isanewlist联结两个list
三个冒号“:::”,向list中添加元素两个冒号“::”::方法(操作符)是右操作符,也就是使用::右边的对象来调用它的::方法,Scala中规定所有以:开头的操作符都是右操作符,因此如果你自己定义以:开头的方法(操作符)也是右操作符。
1
val
oneTowThree
=
1
::
2
::
3
::
Nil
2
println(oneTowThree)
调用空列表对象Nil的::方法也就是
1
val
oneTowThree
=
Nil.
::
(
3
).
::
(
2
).
::
(
1
)
Tuples,和List不同的Tuples可以包含不同类型的数据,而List只能包含同类型的数据使用._和索引来访问员组的元素
1
val
pair
=
(
99
,
"Luftballons"
)
2
println(pair.
_
1
)
3
println(pair.
_
2
)
目前Scala支持的元祖的最大长度为22Trait的概念类似于Java中的Interface,所不同的Scala中的Trait可以有方法的实现Scala
API定义了Set的基Trait类型Set,分两个包定义Mutable(可变)和Immutable(不可变),缺省情况Set为Immutable
Set认识哪种是指令编程,哪种是函数式编程:如果代码中含有var类型的变量,这段代码就是传统的指令式编程,如果代码只有val变量,这段代码就很有可能是函数式代码指令式编程:
1
def
printArgs
(args
:
Array[String])
:
Unit
=
{
2
var
i
=
0
3
while
(i
<args.length){
4
println
(args(i))
5
i+
=
1
6
}
7
}
函数式编程:
1
def
printArgs
(args
:
Array[String])
:
Unit
=
{
2
for
(
arg<-args)
3
println(arg)
4
}
或者更简化为:查看源代码打印帮助
1
def
printArgs
(args
:
Array[String])
:
Unit
=
{
2
args.foreach(println)
3
}
读取E:\logs\error.log文件内容:
for
(
line<-Source.fromFile("E:\logs\error.log"
).getLines())
1
println(line.length
+
"
"
+
line)

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: