直接mkString()打印数组元素:
val ints:Array[Int]=Array(1,2,3,4,5)
println(ints.mkString("分隔符")) //得到的是一个字符串
增强for:
for(a:Int<-ints){
print(a+",")
}
scala中的异常默认直接抛出
2.读写文件
读文件 java的方式
Java中的缓冲流读取文件
val bufferedReader=new BufferedReader(new FileReader("文件路径"))
var line:String=bufferedReader.readLine()
while(line!=null){
println(line) (此处注意,(line=bufferedReader.readline())!=null是不可以的)
line=bufferedReader.readLine()
}
读文件 Scala的方式
//迭代器可以toList
val bufferedSource:BufferedSource=Source.fromFile("文件路径")
val lines:Interator[String]=bufferedSourcce.getLines()
for(line<-lines){
println(line)
}
bufferedReader.close()
写文件
val fileWriter=new FileWriter("文件路径")
fileWriter.write("java"+"n"+"hadoop")
fileWriter.close()
3.函数(定义,调用,简写)
1.main方法的区别
public static void main(String[] args){....}
def main(args:Array[String]):Unit={....}
简写:
1.函数体最后一行作为返回值,return可以省略
def add1(x: Int): Int = {
x + x
}
2.函数体在同一行,{}可以省略
def add2(x: Int, y: Int): Int = x + y
3.返回值类型可以根据参数列表自动进行推断,可以省略
def add3(x: Int, y: Int) = x + y
4.参数列表为空,()可以不写,但是调用的时候也不可以写()
def pr(): Unit = println("scala")
3.函数的调用
1.使用object名称调用方法
println(obj名称.add(100,200))
println(add2(100,200))
2.函数的参数只有一个时,省略". ()"
val str="java,spark,hadoop"
val string1:Array[String]=str.split(",")
简写:val String1:Array[String]=str split ","
tuple(元组:固定长度的集合) 下划线加下标获取数据,从1开始
存储多个相同或不同的值,长度和内容都不可变,最多能存22个元素
val tuple=Tuple5(1,2,3,4,5) //指定集合类型 以及元素个数
简写: val tuple=(1,2,3,4,5)
println(tuple._5) //元组名称._索引 快速得到元素,避免下标越界异常
map集合 kv键值形式的集合 (简写 ->函数)
val map:Map[String,Int]=Map(("001",23),("002",24),"003"->25)
val value1=map("001") //通过key取得value
println(value)
val value2=map.getOrElse("006",0) //key不存在就返回默认值(Int)
println(value2)
//给每个人的值加1 参数为二元组的类型,元组内部是String和Int
val addAge:Map[String,Int]=map.map((kv:(String,Int))=>{
val id=kv._1
val age=kv._2
(id,age+1) //每次返回一个新的二元组
}
addAge.foreach(println)
import java.util
object scalaToJava {
def main(args: Array[String]): Unit = {
//Java中的集合
val arrayList=new util.ArrayList[String]()
arrayList.add("java")
arrayList.add("spark")
import scala.collection.JavaConverters._
import scala.collection.JavaConversions._
val scalaList:List[String] =arrayList.asScala.toList
println(scalaList)
val list=List(1,2,3,4,5,6)
val javaList: util.List[Int] =list.asJava
println(javaList)
}
}
6.模式匹配(功能强大)
只有一个能匹配成功,所以下划线可以用来兜底
1.基本数据类型
val i=100
i match {
case 10=>{println("i的值为10")}
case 100=>{println("i的值为100")}
case _=>{println("其他")}
}
2.匹配字符串
val str:String="java"
str match {
case "java" =>
println("java")
case "spark" =>
println("spark")
case _ => println("其它")
}
3.匹配元组(取元组中的元素)
val t: (String, Int, String) = ("张三", 23, "001")
t match {
case (name: String, age: Int, id: String) =>
println(s"$namet$aget$id")
//println(s"$name")
}
//替代下划线 相当于对应得定义三个变量,再取值
val (name: String, age: Int, id: String) = t
println(s"$namet$aget$id")
元组时一个括号,只能手动构建之,而数组还可以通过其他函数切分等得到
4.匹配数组
val array: Array[Any] = Array("001", "李四")
array match {
case Array(id: String, name: String, age: Int) =>
println(s"$idt$name4$age")
case Array(id: String, name: String) =>
println(s"$idt$name")
}
5.匹配类型
val obj: Any = 10
obj match {
case i: Int =>
println(s"obj是一个Int类型:$i")
case s: String =>
println(s"obj是一个String类型:$s")
case d: Double =>
println(s"obj是一个Double类型:$d")
case _ =>
println(s"其它类型:$obj")
}
6.模式匹配的返回值
val i1:Int=100
val t:String=i1%2 match{
case 1=>"奇数"
case 0=>"偶数"
}
println(t)
7.模式匹配在map中的应用 在一定情况下避免报错
val map=Map("001"->"张三","002"->"李四")
println(map.getOrElse("002","默认值")) //如果key没有匹配到就返回默认值
val value1:Option[String]=map.get("005") //在这种情况下会报错
println(value1)
//Option[String]:有值的时候是value1返回的是Some(值),value1.get得到值,没有值返回None
val value2:String=map.get("003") match{
case Some(v)=>v
case None=>"默认值"
}
println(value2)
8.模式匹配结合函数使用 (集合元素为一个大的String)
val lines: List[String] =Source.fromFile("D:\mavenprojects\maven_study\scala_demo\src\data\students.txt").getLines().toList
val map1: List[Array[String]] =lines.map(line=>line.split(",")) //集合元素为字符串数组
//匹配取出数据,直接从数组中取出需要的元素组成元组
val map2: List[(String, String, String, String)] =map1.map{
case Array(id:String,name:String,age:String,gender:String,clazz:String)=>
(id,name,gender,clazz)
}
map2.foreach(println)
}
类的 构造函数的参数
implicit class Read(path:String){ //定义一个隐式转换类
def read():List[String]={ //构造函数的参数类型转成类的类型
Source.fromFile(path).getLines().toList
}
}
val scores:List[String]="data/score.txt".read()
3.隐式转换变量会对隐式转换的参数自动补齐(类型要对应上)
def add(x: Int)(implicit y: Int): Int = {
x + y
}
val i: Int = add(100)(200)
println(i)
//定义一个隐式转换变量
implicit val a: Int = 1000
//调用方法时,会自动使用当前作用域同类型的隐式转换变量填补上发方法的隐式转换参数
val j: Int = add(200)
println(j)