目录
前言:
Scala是一门很费脑子的语言,不是必要的话,请谨慎入坑(个人感受)
Scala
一:Scala介绍以及Scala安装使用
1.1 Scala6个特征。
1).Java和scala可以混编
2).类型推测(自动推测类型)
3).并发和分布式(Actor)
4).特质,特征(类似java中interfaces 和 abstract结合)
5).模式匹配(类似java switch)
6).高阶函数
1.2 windows安装,配置环境变量
- 官网下载:http://www.scala-lang.org/download/2.10.4.html
- 下载好后安装。双击msi包安装,记住安装的路径。
- 配置环境变量(和配置jdk一样)
- 新建SCALA_HOME
- 上个步骤完成后,编辑Path变量,在后面追加如下:;%SCALA_HOME%\bin;%SCALA_HOME%\jre\bin
- 打开cmd,输入:scala - version 看是否显示版本号,确定是否安装成功
- idea 中配置scala插件
1)打开idea,close项目后,点击Configure->Plugins
2)搜索scala,点击Install安装
3)设置jdk,打开Project Structure,点击new 选择安装好的jdk路径
4)创建scala项目,配置scala sdk(Software Development Kit)
补充:如何在项目中运行一个scala代码:new 新建一个Scala的object而不是class
1.3 linux环境下scala的安装
访问Scala官网(官网),下载Scala。登录后,官网会自动识别你的操作系统类型,如果是Linux操作系统,
官网会自动提供.tgz格式的安装包,比如,笔者于2016年10月31日登录官网,可以下载到scala-2.11.8.tgz(文件大小是27.3MB)。
这里假设scala-2.11.8.tgz被下载到“~/下载/”目录下面,其中,“~”表示当前用户的工作目录,比如,
如果当前你正在使用用户名hadoop登录Linux系统,那么,当前用户的工作目录就是“/home/hadoop/”。
在Linux操作系统中安装Scala的过程如下。
首先要指定Scala的安装目录,比如,这里我们选择安装在“/usr/local/”目录下,这里假设当前用户登录名是hadoop。
然后,把刚才下载的scala-2.11.8.tgz文件解压缩到“/usr/local/”目录下,修改文件夹名称,并为hadoop用户赋予权限,具体如下:
sudo tar -zxf ~/下载/scala-2.11.8.tgz -C /usr/local # 解压到/usr/local中
cd /usr/local/
sudo mv ./scala-2.11.8/ ./scala # 将文件夹名改为scala
sudo chown -R hadoop ./scala # 修改文件权限,用hadoop用户拥有对scala目录的权限
Shell 命令
接着需要把scala命令添加到path环境变量中。这里我们在 ~/.bashrc 中进行设置。可以采用vim编辑器打开.bashrc文件:
vim ~/.bashrc
Shell 命令
打开vim编辑器以后,需要键盘敲击输入一个字母i,进入编辑状态,然后才能修改内容。
然后,在.bashrc文件的最开头位置,修改path环境变量设置,把scala命令所在的目录“/usr/local/scala/bin”增加到path中,具体如下:
export PATH=$PATH:/usr/local/scala/bin
注意,上面的PATH和等号之间,不要加入任何空格,否则会出错。
修改后,保存退出(方法是:首先,按键盘Esc键,退出vim的编辑状态,然后,敲击键盘输入“:wq”三个英文字母,然后回车,即可保存退出)。
接着还需要让该环境变量生效,执行如下代码:
source ~/.bashrc # 使变量设置生效
Shell 命令
设置好后我们来检验一下是否设置正确,可以输入scala命令:
scala
Shell 命令
输入scala命令以后,屏幕上显示scala和Java版本信息,并进入“scala>”提示符状态,就可以开始使用Scala解释器了,你就可以输入scala语句来调试程序代码了。
二:Scala基础
2.1 数据类型
2.2 变量和常量的声明
1)定义变量
- 定义变量或者常量的时候,也可以写上返回的类型,一般省略,如:val a:Int = 10
- 常量不可再赋值
变量 :用 var 定义 ,可修改
常量 :用 val 定义,不可修改
/**
* 定义变量和常量
* 变量 :用 var 定义 ,可修改
* 常量 :用 val 定义,不可修改
*/
var name = "zhangsan"
println(name)
name ="lisi"
println(name)
val gender = "m"
//gender = "m"//错误,不能给常量再赋值
2)创建对象
class Person{
val name = "zhangsan"
val age = 18
def sayName() = {
"my name is "+ name
}
}
object Lesson_Class {
def main(args: Array[String]): Unit = {
val person = new Person()
println(person.age);
println(person.sayName())
}
}
3)apply :如果在创建Object时传入参数,那么会自动根据参数的个数去Object中寻找相应的apply方法
/**
* object 单例对象中不可以传参,
* 如果在创建Object时传入参数,那么会自动根据参数的个数去Object中寻找相应的apply方法
*/
object Lesson_ObjectWithParam {
def apply(s:String) = {
println("name is "+s)
}
def apply(s:String,age:Int) = {
println("name is "+s+",age = "+age)
}
def main(args: Array[String]): Unit = {
Lesson_ObjectWithParam("zhangsang")
Lesson_ObjectWithParam("lisi",18)
}
}
4)伴生类和伴生对象
class Person(xname :String , xage :Int){
var name = Person.name
val age = xage
var gender = "m"
def this(name:String,age:Int,g:String){
this(name,age)
gender = g
}
def sayName() = {
"my name is "+ name
}
}
object Person {
val name = "zhangsanfeng"
def main(args: Array[String]): Unit = {
val person = new Person("wagnwu",10,"f")
println(person.age);
println(person.sayName())
println(person.gender)
}
}
2.3 注意问题
- 建议类名首字母大写 ,方法首字母小写,类和方法命名建议符合驼峰命名法。
- scala 中的object是单例对象,相当于java中的工具类,可以看成是定义静态的方法的类。
- object不可以传参数。另:Trait不可以传参数
- scala中的class类默认可以传参数,默认的传参数就是默认的构造函数。
重写构造函数的时候,必须要调用默认的构造函数。
- class 类属性自带getter ,setter方法。
- 使用object时,不用new,使用class时要new ,并且new的时候,class中除了方法不执行,其他都执行。
- 如果在同一个文件中,object对象和class类的名称相同,则这个对象就是这个类的伴生对象,这个类就是这个对象的伴生类。可以互相访问私有变量。[
2.4 循环语句
1)if else
/**
* if else
*/
val age =18
if (age < 18 ){
println("no allow")
}else if (18<=age&&age<=20){
println("allow with other")
}else{
println("allow self")
}
2)for ,while,do…while
to和until 的用法(不带步长,带步长区别)
1 to 10 返回1到10的Range数组,包含10
* 1 until 10 返回1到10 Range数组 ,不包含10
for(i <- 1 to 10){
println(i)
}
9 9 乘法表
for(i <- 1 until 10){
for(j <- 1 until 10){
if(i>=j){
print(i + " * "+j + " = "+ i*j+"\t")
}
}
println()
}
for 里面加条件
for( i <- 1 to 1000;if(i>500);if(i%2==0)){
println(i)
}
val res = for(i <- 1 to 100 if(i>50) if(i%2==0)) yield i
print(res)
var i=0
while(i<20){
print(s"第 $i 次求婚")
i+=1;
}
for循环
//可以分号隔开,写入多个list赋值的变量,构成多层for循环
//scala中