Scala
1.数据类型
scala相比较以与java语言多出来以下几种数据类型:
- Unit:表示无返回值,与java语言中的void相同
- Null:空值或者空引用
- Nothing:所有其它类型的子类型,表示没有值
- Any:所有类型的超类,任何实例都属于any类型
- AnyRef:所有引用类型的超类
- AnyVal:所有值的超类
2.类和对象
-
在scala语言中一行的结尾可以省略分号,若一行中有多个语句,则需要用分号隔开
-
val 是声明常亮 var是声明变量的
-
class 属性是自带getter setter
-
class 如果有参数传进去,则是为他的默认构造器,重写构造器时,需要调用默认构造器
class Person(xname: String, xage: Int) { val name = xname val age = xage /** * 重写构造器,必须调用默认构造器 */ def this(xname: String, xage: Int, xmoney: Int) { this(xname, xage) money = xmoney }
-
class new对象时,除了方法内部不执行,其他的都执行
-
object 不能传参,object是单例,可以认为是java中的单例对象,并且它里面的方法也是静态的,
-
在同一个scala文件中,若class与object的名字相同,则互为伴生类,伴生对象,它们可以直接访问对方的所有变量
class Person(xname:String,xage:Int){
val name =xname;
val age = xage;
private var money=100;
}
def test(): Unit ={
println(Person.test)
}
}
object Person {
private var test = "wuming"
//public static void main (String[] args)
def main(args: Array[String]): Unit = {
val person: Person =new Person("zs",18,1000)
println(person.name+":"+person.age+":"+person.money)
}
}
3.循环
object Loop {
def main(args: Array[String]): Unit = {
//1 to 10 返回1到10的Range数组,包含10
println(1 to 10)
//1 to 10 返回1到10的Range数组,不包含10
println(1 until 10)
}
}
object Loop {
def main(args: Array[String]): Unit = {
for (i <- 1 to 10){
println(i)
}
/**
*可以在for循环中加入条件判断
*/
for (i <- 1 to 10;if i>5;if i%2==0){
println(i)
}
}
4.Scala函数
- 在scala语法中,return是可以省略掉,scala自动将函数的最好一行的值,作为返回值,{}在只有一行语句时也可以省略
object Function {
def main(args: Array[String]): Unit = {
def max(a:Int,b:Int)={
if (a>b)
a
else
b
}
val result=max(1,2)
println(result)
}
}
-
函数可以省略返回类型,会自动推动,但是当显示的调用return时,不可以省略返回类型
-
如果省略掉 = ,则函数会自动将返回值丢弃,所有我们可以在不需要返回值的函数上,省略=
-
函数里面的参数都是val,所以在函数中不可以修改参数值
-
递归函数,不可以省略返回类型
object Function {
def main(args: Array[String]): Unit = {
def f1(number:Int): Int ={
if (number==1)
return 1
number*f1(number-1)
}
println(f1(3))
package com.shsxt
object Function {
def main(args: Array[String]): Unit = {
/**
* 包含默认值参数的函数
*/
def f2(a: Int = 4, b: Int = 5): Int = {
a + b
}
println(f2(b = 6))
}
package com.shsxt
object Function {
def main(args: Array[String]): Unit = {
/**
* 可变参数函数
*/
def sum(a:Int*) ={
var sum =0
for(i <- a){
sum += i
}
sum
}
println(sum(1,2,3,4,5))
}
package com.shsxt
object Function {
def main(args: Array[String]): Unit = {
/**
* 匿名函数
*/
var f4 = (a:Int,b:Int) => {
println(a+b)
}
f4(1,10)
val f5 =()=>{
println("无参匿名函数...")
}
f5()
}
- 嵌套函数
package com.shsxt
object Function {
/**
* 嵌套函数
*/
def f6(a: Int, b: Int) = {
def f7(c: Int) = {
(a + b) * c
}
println(f7(10))
}
f6(1, 2)
}
package com.shsxt
import java.util.Date
object Function {
def main(args: Array[String]): Unit = {
/**
* 偏应用函数
*/
def log(date: Date, log: String) = {
println("date is " + date + ",log is " + log)
}
val date = new Date()
//想要调用log,以上变化的是第二个参数,可以用偏应用函数处理
val logWithDate = log(date, _: String)
logWithDate("log11")
logWithDate("log12")
logWithDate("log13")
def f7(a: Int, f: (Int, Int) => Int) = {
val result = f(1, 2)
println( "result : " + result)
println(a * result)
}
def sum(a: Int, b: Int):Int = {a + b}
f7(5,sum)
f7(5,(a:Int,b:Int)=>{a + b})
def f8(a:Int,b:Int):(String,String)=>String = {
def f9(c:String,d:String):String={
a + "!" + b + "!" + c + "!" + d
}
f9
}
// alt + enter
val f9: (String, String) => String = f8(1,2)
val result = f9("3","4")
println(result)
val result = f8(6,7)("8","9")
println(result)
package com.shsxt
import java.util.Date
object Function {
def main(args: Array[String]): Unit = {
/**
* 柯里化函数
*/
def fun7(a :Int,b:Int)(c:Int,d:Int) = {
a+b+c+d
}
println(fun7(1,2)(3,4))
}
5.Scala字符串
package com.shsxt
/**
* Created by Administrator on 2019/12/23.
*/
object String {
def main(args: Array[String]): Unit = {
val str = "abcd"
println(str.indexOf(98))
println(str.indexOf("b"))
val str1 = "ABCD"
//比较地址
println(str==str1)
/**
* compareToIgnoreCase
* 不区分大小写
* 如果参数字符串等于此字符串,则返回值 0;
* 如果此字符串小于字符串参数,则返回一个小于 0 的值;
* 如果此字符串大于字符串参数,则返回一个大于 0 的值。
*
*/
println(str.compareToIgnoreCase(str1))
/**
* 字符串连接使用StringBuilder
*/
var stringBuilder = new StringBuilder
stringBuilder.append("abc")
stringBuilder.+('d')
stringBuilder+'e'
stringBuilder.++("fg")
stringBuilder++="hi"
stringBuilder.+=('j')
stringBuilder+='k'
println(stringBuilder)
}
}
6.数组
package com.shsxt
/**
* 可变集合,不可变集合
*/
object Sxt_Array {
def main(args: Array[String]): Unit = {
//创建数组
val array =Array(1,2,3)
//遍历
for (i<- array){
println(i)
}
array.foreach(x=>{println(x)})
array.foreach(println(_))
array.foreach(println)
//创建数组
val array1 =new Array[Int](3)
array1(0)=1
array1(1)=2
array1(2)=3
array1.foreach(println)
println("=====创建二维数组======")
//创建二维数组
val array2=new Array[Array[Int]](3)
array2(0)=Array(1,2)
array2(1)=Array(3,4)
array2(2)=Array(5,6)
array2.foreach(x=>{
x.foreach(println)
})
println("=====合并数组=======")
//合并数组
var arr1 = Array("1","2","3")
var arr2 = Array("3","4","5")
val array3=Array.concat(arr1,arr2)
array3.foreach(println)
println("======创建初始值的定长数组=======")
//创建初始值的定长数组
val arr = Array.fill(5)("shsxt")
arr.foreach(println)
}
}
val arr = ArrayBuffer[String]("a","b","c")
arr.append("hello","scala")//添加多个元素
arr.+=("end")//在最后追加元素
arr.+=:("start")//在开头添加元素
arr.foreach(println)
7.list
package com.shsxt
/**
* Created by Administrator on 2019/12/24.
*/
object Sxt_list {
def main(args: Array[String]): Unit = {
//创建
var list =List(1,2,3)
//遍历
for (i<-list){
println(i)
}
list.foreach(println)
println("======常用方法=========")
//filter 过滤
val result: List[Int] =list.filter(x=>{
if(x>2)
true
else
false
})
result.foreach(println)
//计算符合条件的元素个数
val count: Int =list.count(x=>{
if(x>2)
true
else
false
})
println(count)
//操作集合里面的元素
val result1: List[Int] =list.map(x=>{
x*2
})
result1.foreach(println)
val array = List("hello shsxt","hello bjsxt","hello gzsxt")
val mapResult: List[Array[String]] =array.map(x=>{
x.split(" ")
})
mapResult.foreach(println)
println("======flatmap :压扁扁平,先map再flat========")
val result2: List[String] = array.flatMap(x=>x.split(" "))
result2.foreach(println)
}
}
val listBuffer = ListBuffer(1,2,3)
listBuffer.append(3,4,5)
listBuffer.foreach(println)
val listBuffer: ListBuffer[Int] = ListBuffer[Int](1,2,3,4,5)
listBuffer.append(6,7,8,9)//追加元素
listBuffer.+=(10)//在后面追加元素
listBuffer.+=:(100)//在开头加入元素
listBuffer.foreach(println)
8.set
package com.shsxt
/**
* set
*/
object Sxt_set {
def main(args: Array[String]): Unit = {
//set自动去重
val set1: Set[Int] = Set(1,2,2,3)
set1.foreach(println)
//最大
println(set1.max)
//最小
println(set1.min)
val set2 = Set(1,4,5)
//转成字符串
val str = set2.mkString("!")
println(str)
println("====并集====")
val set = set1.union(set2)
set.foreach(println)
println("===差集====")
val set3 = set2.diff(set1)
set3.foreach(println)
println("===交集====")
val set4 = set1.intersect(set2)
set4.foreach(println)
}
}
import scala.collection.mutable.Set
val set = Set[Int](1,2,3,4,5)
set.add(100)
set.+=(200)
set.+=(1,210,300)
set.foreach(println)
9.Map
package com.shsxt
/**
* Created by Administrator on 2019/12/24.
*/
object Sxt_map {
def main(args: Array[String]): Unit = {
//创建map
val map: Map[String, Any] = Map("name" -> "zs", "age" -> "18", ("money", 100))
//全遍历
map.foreach(x => println(x._1 + " " + x._2))
//不确认map是否存在
val option = map.get("name")
println(option.get)
//如果没有指定map的值,就赋值传入的值
val result = map.getOrElse("lala", 100)
println(result)
println("==========================")
//遍历key
val keyIterable = map.keys
keyIterable.foreach(key => {
println(key + " " + map.get(key).get)
})
println("==========================")
//遍历value
val valueIterable = map.values
valueIterable.foreach(value => {
println(value)
})
println("==================")
//合并map 合并map会将map中的相同key的value替换
val map1 = Map((1, "a"), (2, "b"), (3, "c"))
val map2 = Map((1, "aa"), (2, "bb"), (2, 90), (4, 22), (4, "dd"))
map1.++(map2).foreach(x=>{
println(x._1+" "+x._2)
})
}
}
/**
* map方法
*/
//count统计符合条件的记录数
val countResult = map.count(p => {
p._2.equals("shsxt")
})
println(countResult)
//filter过滤,留下符合条件的记录
map.filter(_._2.equals("shsxt")).foreach(println)
//contains map中是否包含某个key
println(map.contains(2))
//exist 符合条件的记录存在不存在
println(map.exists(f =>{
f._2.equals("xasxt")
}
import scala.collection.mutable.Map
val map = Map[String,Int]()
map.put("hello",100)
map.put("world",200)
map.foreach(println)
10.元组
与列表一样,与列表不同的是元组可以包含不同类型的元素。元组的值是通过将单个的值包含在圆括号中构成的
-
创建元组与取值
package com.shsxt object Sxt_tuple { def main(args: Array[String]): Unit = { //创建,最多支持22个 val tuple = new Tuple1(1) val tuple2 = Tuple2("zhangsan",2) val tuple3 = Tuple3(1,2,3) val tuple4 = (1,2,3,4) val tuple18 = Tuple18(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18) val tuple22 = new Tuple22(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22) //使用 println(tuple2._1 + "\t"+tuple2._2) val t = Tuple2((1,2),("zhangsan","lisi")) println(t._1._2) //创建和取值 val tuple2: (String, Int) = Tuple2("zhangsan",2) println(tuple2._1 + "\t"+tuple2._2) val t = Tuple2((1,2),("zhangsan","lisi")) println(t._1._2) //遍历 val tuple4 = (1,2,3,4) val tupleIterator=tuple4.productIterator while(tupleIterator.hasNext){ println(tupleIterator.next()) } //swap方法,元素翻转(只针对二元组) val swap=tuple2.swap println(swap) } }