本教程基于scala官网的的tour of scala制作,如有对文章内容有任何建议,欢迎通过站内信或邮箱zhujunyuan@yeah.net沟通交流。
一、环境安装
1.搭建java环境,通过oracle官网下载安装jdk,本文基于jdk1.8.0_191-b12,如果使用openJdk,配置上可能有差异,请留意。安装教程可参考官网,下载解压,编辑环境变量即可。
2.从scala官网下载intellij版本(包含ide,相当与jdk捆绑netbean套装)或者sbt版本(需要自行配置环境变量,mac下可以通过
brew install scala
命令直接安装(无需配置环境变量),linux下载安装repo后可以通过yum命令直接安装,可以查看官网教程:scala官网使用教程
二、scala旅程正式开始
表达式
1.打开scala自带的命令行模式
scala
2.熟悉下基础
- 打印helloworld:
println("Hello world!")
- 算数表达式支持
println( 1 + 1 )
- val变量支持(不可变对象,相当于常量声明)
val a = 1 + 1
println( a )
常量声明支持类型指定,比如
val a : Int = 2
- 变量声明
var x = 3
x = 5
同样的可以在变量后加上:
再加指定类型
var x : Int = 2
函数块
- 函数块都是通过
{}
,需要注意的是scala的函数块是有返回值的,官方给的说明是
The result of the last expression in the block is the result of the overall block
函数块的最后一个表达式就是函数块整体的返回值
尝试下
scala> println({})
()
#返回Unit#
scala> println({ val x = 6 })
()
#赋值语句没有返回值#
scala> println({ val x = 6; x + 1 })
7
#算数表达式返回计算结果#
scala> println( {{ var x = 6 ; x + 1 }} )
7
#函数块内可以嵌套函数块#
函数
- 匿名函数
scala> ( x : Int ) => x + 1
res6: Int => Int = $$Lambda$1089/1731588624@4567fb2b
这个函数中x代表形参名称,:
后接参数类型,多个参数之间用,
隔开即可,与c或java中的方法不同,函数即使有返回值也不用申明返回值的类型,尝试些例子
scala> val addOne = (x : Int) => x + 1
addOne: Int => Int = $$Lambda$1090/1828724670@d120d7c
scala> addOne(10)
res7: Int = 11
scala> val add = (x : Int , y : Int) => x + y
add: (Int, Int) => Int = $$Lambda$1099/2144511610@163df259
scala> add(1 , 2)
res8: Int = 3
#返回值测试,可以返回不同类型的值,类型为Any#
scala> val test = (x : Int, y : String) => { if(x > 1) x else y }
test: (Int, String) => Any = $$Lambda$1127/367954017@6afaf27
scala> test(1 , "dale")
res9: Any = dale
scala> test(2 , "dale")
res10: Any = 2
可以函数的灵活度相较于c和java灵活性方面优势还是挺大的。
方法
使用def
关键字进行定义,与函数不同的是,方法可以接受多个参数列表,尝试下:
#可以传递同时传递多个参数列表,返回类型可以省略
scala> def addParameter(x : Int, y : Int)(z : Int): Int= x + y + z
addParameter: (x: Int, y: Int)(z: Int)Int
scala> println( addParameter(1, 2)(3) )
6
#可以不传参数
scala> def name = System.getProperty("user.name")
name: String
scala> println( "Hello" + name )
Hellojunyuan
与函数相比,方法还有另外一些区别,现先暂时认为他们是一致的。
类
使用关键字class
进行定义,后接类名(
构造器参数名及类型)
, 然后在{
和}
中书写方法,需要注意的是,当没有任何有意义的值要返回时,官方推荐使用: Unit
做为返回值,这个关键字和java和C中的void关键字使用类似,区别是scala中表达式是必须有返回值的,Unit实际上是一个类的单例,这个类中不包含任何信息,可以参考官方说明:
A difference is that because every Scala expression must have some value, there is actually a singleton value of type Unit, written (). It carries no information.
scala> class Gretting( prefix : String , suffix : String){
| def sayHello( name : String ) : Unit{
| println( "Hello\n" + prefix + name + suffix )
| }
| }
defined class Gretting
scala> val greeting = new Gretting( " Hero ", "XXXXX" );
greeting: Gretting = Gretting@28b5cee
scala> greeting.sayHello("dale")
Hello
Hero daleXXXXX
更多类相关的知识在后续章节中探讨
case class
根据官方说明,这是一种特殊的类,它又一个显著的特征:默认情况下,这个类是不可变的,并且这个类的实例根据值进行比较。这个特性对于java程序员相当实用的一项功能了,不需要重新书写hashCode和equals方法,即可实现基于值的比较。
a: Point = Point(1,2)
scala> var b = Point( 1, 2 )
b: Point = Point(1,2)
scala> a == b
res15: Boolean = true
scala> a = Point( 3, 4 )
a: Point = Point(3,4)
scala> b
res16: Point = Point(1,2)
很多其他的实用特性,参考后续章节
对象
object是他们自身定义的一个实例,你可以当他们是自身的一个单例
Objects are single instances of their own definitions. You can think of them as singletons of their own classes.
通过object关键字进行定义:
scala> object Sequence{
| private var curVal = 0
| def create() : Int = {
| curVal += 1
| curVal
| }
| }
defined object Sequence
scala> Sequence.create()
res20: Int = 1
scala> Sequence.create()
res21: Int = 2
Traits
从说明看,类似java中的interface,可以组合,同样支持默认的实现。
Traits are types containing certain fields and methods. Multiple traits can be combined.
scala> trait Greeter{
| def say( word : String )
| }
defined trait Greeter
scala> class Test( name : String ) extends Greeter{
| def say( word : String ){
| println( name + "\t" + word )
| }
| }
defined class Test
scala> val dale = new Test("dale")
dale: Test = Test@2f47ebc7
scala> dale.say("hi")
dale hi
scala> trait Greeter{
| def say( word : String ) : Unit = {
| println( "default: " + word)
| }
| }
defined trait Greeter
scala> class DefaultGreeter extends Greeter
defined class DefaultGreeter
scala> val greeter = new DefaultGreeter()
greeter: DefaultGreeter = DefaultGreeter@dce1556
scala> greeter.say("dengdengdeng")
default: dengdengdeng
主方法
也就是java中的main方法,因为jvm要求一个接受string数组的main命名的方法作为运行入口。当使用object时,可以这样使用:
scala> object Main {
| def main(args: Array[String]): Unit =
| println("Hello, Scala developer!")
| }
defined object Main
网友评论