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 = 18
if (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()
//返回此字符串的长度
-