scala
一.scala基础
1.数据基础
2.变量和常量的声明
var 定义的是变量可以修改val 定义的是常量不可以修改
package com.shsxt.scala?/** * @author: Savage * @data: 2019/10/21 19:50 */object Text {? class Person{ var name = "zhangsan" var age = 18? def sayName={ "this name is" + name } }? def main(args: Array[String]): Unit = { val person = new Person() println(person.name) println(person.age) println(person.sayName) }?}
创建对象可以通过new对象获取其中的属性的方法
package com.shsxt.scala/** * @author: Savage * @data: 2019/10/21 19:55 */class CompanionObject(xname: String, xage: Int) { var name = CompanionObject.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 CompanionObject { private val name = "zhangsanfeng" // val age=19? def main(args: Array[String]): Unit = { val person = new CompanionObject("wagnwu", 10, "f") println(person.age); println(person.sayName()) println(person.gender) } }
伴生类和伴生对象可以互相访问其中的私有的属性.区别伴生类和伴生对象的方法时两个类的名字一样
scala语言的注意点:
建议类名首字母大写 ,方法首字母小写,类和方法命名建议符合驼峰命名法
scala 中的object是单例对象,相当于java中的工具类,可以看成是定义静态的方法的类。object不可以传参数
scala中的class类默认可以传参数,默认的传参数就是默认的构造函数.重写构造函数的时候,必须要调用默认的构造函数。
l class 类属性自带getter ,setter方法。
使用object时,不用new,使用class时要new ,并且new的时候,class中除了方法不执行,其他都执行
如果在同一个文件中,object对象和class类的名称相同,则这个对象就是这个类的伴生对象,这个类就是这个对象的伴生类。可以互相访问私有变量。
3.一些常用的类
if
val age = 18if (age < 18) { println("no allow")} else if (18 <= age && age <= 20) { println("allow with other")} else { println("allow self")}
to和until 的用法
println(1 to 10) //Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)println(1 until 10) //Range(1, 2, 3, 4, 5, 6, 7, 8, 9, )
to 包含最后一个元素;until不包含最后一个元素
for循环
object Loop { def main(args: Array[String]): Unit = { for (i <- 1 to 10) println(i)? }}
package com.shsxt.scala?/** * @author: Savage * @data: 2019/10/21 20:14 */object Loop { def main(args: Array[String]): Unit = { for(i <- 1 until 10 ;j <- 1 until 10){ if(i>=j){ print(i +" * " + j + " = "+ i*j+" ") } if(i==j){ println() } }? }}
for循环中加判断条件
object Loop { def main(args: Array[String]): Unit = { for(i <- 1 until 10 ;if(i%2==0&&i>5)) { println(i) } }}
scala中不能使用count++,count—只能使用count = count+1 ,count += 1
for循环用yield 关键字返回一个集合
二.scala函数
函数定义
object TestFunction {? def main(args: Array[String]): Unit = { println(fun1(1,2)) def fun1(a:Int,b:Int)={ a+b } }}
注意点:
函数定义语法 用def来定义
可以定义传入的参数,以及指定传入参数的类型
方法可以写返回值的类型也可以不写,会自动推断,有时候不能省略,必须写,比如在递归函数中或者函数的返回值是函数类型的时候
l scala中函数有返回值时,可以写return,也可以不写return,会把函数中最后一行当做结果返回。当写return时,必须要写函数的返回类型。
如果返回值可以一行搞定,可以将{}省略不写
传递给方法的参数可以在方法中使用,并且scala规定方法的传过来的参数为val的,不是var的。
l 如果去掉方法体前面的等号,那么这个方法返回类型必定是Unit的。这种说法无论方法体里面什么逻辑都成立,scala可以把任意类型转换为Unit.假设,里面的逻辑最后返回了一个string,那么这个返回值会被转换成Unit,并且值会被丢弃。
递归函数
println(fun2(5))def fun2(a:Int):Int={ if(a==1) a else a*fun2(a-1)}
包含参数默认值的函数
def fun3(a :Int = 10,b:Int) = { println(a+b) } fun3(b=2)}
l 默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值。
如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称。
可变参数个数的函数
//多个参数用逗号分开def fun4(elements :Int*)={ var sum = 0; for(elem <- elements){ sum += elem } sum} println(fun4(1,2,3,4)) }
匿名函数
//有参数匿名函数val value1 = (a : Int) => { println(a)}value1(1)//无参数匿名函数val value2 = ()=>{ println("我爱尚学堂")}value2()//有返回值的匿名函数val value3 = (a:Int,b:Int) =>{ a+b}println(value3(4,4))
嵌套函数
def fun5(num:Int)={ def fun6(a:Int,b:Int):Int={ if(a == 1){ b }else{ fun6(a-1,a*b) } } fun6(num,1)} println(fun5(5))
偏应用函数
def log(date :Date, s :String)= { println("date is "+ date +",log is "+ s)}? val date = new Date() log(date ,"log1") log(date ,"log2") log(date ,"log3")? //想要调用log,以上变化的是第二个参数,可以用偏应用函数处理 val logWithDate = log(date,_:String) logWithDate("log11") logWithDate("log22") logWithDate("log33")
高阶函数
//函数的参数是函数def hightFun(f : (Int,Int) =>Int, a:Int ) : Int = { //这里的100和a是函数f v1和v2的值,所以写的顺序无关,最后只要a这个变量对应上传进来的值即可 f(a,100)} def f(v1 :Int,v2: Int):Int = { v1+v2 }? println(hightFun(f, 1))
//函数的返回是函数def hightFun2(a : Int,b:Int) : (Int,Int)=>Int = { def f2 (v1: Int,v2:Int) :Int = { v1+v2+a+b } f2} println(hightFun2(1,2)(3,4))
//函数的参数是函数,函数的返回是函数def hightFun3(f : (Int ,Int) => Int) : (Int,Int) => Int = { f} println(hightFun3(f)(100,200)) println(hightFun3((a,b) =>{a+b})(200,200)) //以上这句话还可以写成这样 //如果函数的参数在方法体中只使用了一次 那么可以写成_表示 println(hightFun3(_+_)(200,200))
柯里化函数
def fun7(a :Int,b:Int)(c:Int,d:Int) = { a+b+c+d} println(fun7(1,2)(3,4))
三.字符串
String 定长
String 方法 char charAt(int index)//返回指定位置的字符 从0开始 int compareTo(Object o)//比较字符串与对象 int compareTo(String anotherString)//按字典顺序比较两个字符串 int compareToIgnoreCase(String str)//按字典顺序比较两个字符串,不考虑大小写 String concat(String str)//将指定字符串连接到此字符串的结尾 boolean contentEquals(StringBuffer sb)//将此字符串与指定的 StringBuffer 比较。 static String copyValueOf(char[] data)//返回指定数组中表示该字符序列的 String static String copyValueOf(char[] data, int offset, int count)//返回指定数组中表示该字符序列的 String boolean endsWith(String suffix)//测试此字符串是否以指定的后缀结束 boolean equals(Object anObject)//将此字符串与指定的对象比较 boolean equalsIgnoreCase(String anotherString)//将此 String 与另一个 String 比较,不考虑大小写 byte getBytes()//使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中 byte[] getBytes(String charsetName//使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中 void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)//将字符从此字符串复制到目标字符数组 int hashCode()//返回此字符串的哈希码16 int indexOf(int ch)//返回指定字符在此字符串中第一次出现处的索引(输入的是ascii码值) int indexOf(int ch, int fromIndex)//返返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索 int indexOf(String str)//返回指定子字符串在此字符串中第一次出现处的索引 int indexOf(String str, int fromIndex)//返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始 String intern()//返回字符串对象的规范化表示形式 int lastIndexOf(int ch)//返回指定字符在此字符串中最后一次出现处的索引 int lastIndexOf(int ch, int fromIndex)//返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索 int lastIndexOf(String str)//返回指定子字符串在此字符串中最右边出现处的索引 int lastIndexOf(String str, int fromIndex)//返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索 int length()//返回此字符串的长度 boolean