• Scala的简单学习二


    一集合

    1.1 Java集合

    1.在scala创建Java集合需要导入java.util包

    2.不能使用scala中遍历迭代器的方法遍历Java集合

    3.使用下标索引遍历Java集合

    4.list集合中,add是添加元素(可以指定下表索引插入),get是通过下标索引获取元素,size是获取集合长度

    1. //使用Java中的集合
    2. val list = new util.ArrayList[Int]()
    3. //添加元素
    4. list.add(11)
    5. list.add(12)
    6. list.add(13)
    7. list.add(14)
    8. list.add(15)
    9. list.add(16)
    10. println(list)
    11. println("="*100)
    12. //遍历集合
    13. var i: Int = 0
    14. while (i<list.size()){
    15. println(list.get(i))
    16. i+=1
    17. }

    1.2 List

    1.2.1 取元素

    1.直接通过下标索引获取

    集合名(索引)

    2.特殊位置特殊取法

    开头:集合名.head

    结尾:集合名.head

    1. //创建Scala中的List集合
    2. val list: List[Int] = List(88, 66, 22, 99, 11, 33, 110, 11, 22, 44, 22, 55, 11, 33)
    3. println(list)
    4. println("="*100)
    5. //取元素
    6. val i: Int = list(1)
    7. println(i)
    8. println("="*100)//66
    9. //取第一个元素
    10. val head: Int = list.head
    11. println(head)//88
    12. println("="*100)
    13. //取最后一个元素
    14. val last: Int = list.last
    15. println(last)//33
    16. println("="*100)

    1.2.2 tail 去掉开头返回集合

    1.去除第一个元素,返回一个集合

    1. val tail: List[Int] = list.tail
    2. println(tail)//List(66, 22, 99, 11, 33, 110, 11, 22, 44, 22, 55, 11, 33)
    3. println(list)//List(88, 66, 22, 99, 11, 33, 110, 11, 22, 44, 22, 55, 11, 33)

    1.2.3 mkString 分隔符连接

    1. //使用分隔符连接集合中的元素
    2. val str: String = list.mkString("-")
    3. println(str)//88-66-22-99-11-33-110-11-22-44-22-55-11-33
    4. println("="*100)

    1.2.4 reverse反转集合

    1. //反转集合
    2. val reverseList: List[Int] = list.reverse
    3. println(reverseList)//List(33, 11, 55, 22, 44, 22, 11, 110, 33, 11, 99, 22, 66, 88)

    1.2.5   取元素组成新集合

    take,takeRight

    1. //从左向右取n个元素,组成新集合
    2. val takeList: List[Int] = list.take(4)
    3. println(takeList)//List(88, 66, 22, 99)
    4. println("="*100)
    5. //从右向左取n个元素,组成新集合
    6. val takeRightList: List[Int] = list.takeRight(4)
    7. println(takeRightList)//List(22, 55, 11, 33)
    8. println("="*100)

    1.2.6 takeWhile

    1.从第一个元素开始取,直到函数的返回值是false的时候

    1. //从第一个元素开始取,直到函数的返回值是false的时候,组成新集合
    2. //p: A => Boolean
    3. val takeWhileList: List[Int] = list.takeWhile((p: Int) => p % 2 == 0)
    4. println(takeWhileList)//List(88, 66, 22)
    5. println("="*100)

    1.2.7 distinct去重返回集合

    1. val distinctList: List[Int] = list.distinct
    2. println(distinctList)//List(88, 66, 22, 99, 11, 33, 110, 44, 55)
    3. println("="*100)

    1.2.8 sum求和

    1.针对Int的List集合

    1. //求和,针对Int的集合
    2. val sum: Int = list.sum
    3. println(sum)//627
    4. println("="*100)

    1.2.9 最大小值

    1. //求最大小值
    2. val max: Int = list.max
    3. val min: Int = list.min
    4. println(max)//110
    5. println(min)//11
    6. println("="*100)

    1.2.10 遍历集合

    1.使用foreach遍历比较好

    1. //遍历集合
    2. list.foreach(println)
    3. println("="*100)
    4. for (elem <- list) {
    5. println(elem)
    6. }
    7. println("="*100)

    2.foreach里面可以加匿名函数

    1. //求集合中偶数和
    2. var sum1:Int=0
    3. list.foreach((i:Int)=>{
    4. if (i%2==0){
    5. sum1+=i
    6. }
    7. })
    8. println(sum1)

    1.2.11 map

    1.处理集合中每个元素,返回一个列表

    1. //map:处理集合中每个元素,返回一个列表
    2. //集合中每个元素+100
    3. val mapList: List[Int] = list.map((i: Int) => {
    4. i + 100
    5. })
    6. println(mapList)
    7. println("="*100)
    8. //需求,集合中的元素偶数+100 奇数-100
    9. val mapList1: List[Int] = list.map((i: Int) => {
    10. if (i % 2 == 0) {
    11. i + 100
    12. } else {
    13. i - 100
    14. }
    15. })
    16. println(mapList1)

    1.2.12 filter 筛选

    1. //filter:筛选集合中的元素,组成新集合,true的部分成为新集合的元素
    2. //筛选偶数
    3. val filterList: List[Int] = list.filter((i: Int) => {
    4. i % 2 == 0
    5. })
    6. println(filterList)
    7. println("=" * 100)

    1.2.13 flatMap 扁平化

    1. //flatMap:扁平化
    2. val strList: List[String] = List("python|java|linux", "mysql|redis|clickhouse", "hadoop|hive|zookeeper")
    3. val flapMapList: List[String] = strList.flatMap((str: String) => {
    4. str.split("\\|")
    5. })
    6. println(flapMapList)//List(python, java, linux, mysql, redis, clickhouse, hadoop, hive, zookeeper)
    7. println("=" * 100)
    8. //使用迭代器,扁平化
    9. strList.foreach((str: String) => {
    10. val splitList: Array[String] = str.split("\\|")
    11. splitList.foreach(println)
    12. })
    13. println("=" * 100)

    1.2.14 排序 sort,sortWith

    1.默认是升序

    1. //排序:sortBy,默认从小到大,前面加一个-就是从大到小
    2. // sortWith:指定两个元素之间的大小关系进行排序
    3. val sortByList: List[Int] = list.sortBy((i: Int) => {
    4. i
    5. })
    6. println(sortByList)
    7. println("=" * 100)
    8. val sortByList1: List[Int] = list.sortBy((i: Int) => {
    9. -i
    10. })
    11. println(sortByList1)
    12. println("=" * 100)
    13. val sortWithList: List[Int] = list.sortWith((x: Int, y: Int) => x < y)//从小到大
    14. println(sortWithList)
    15. println("=" * 100)
    16. val sortWithList1: List[Int] = list.sortWith((x: Int, y: Int) => x > y)//从大到小
    17. println(sortWithList1)
    18. println("=" * 100)

    1.2.15 groupBy 分组

    1.得到的是一个字典

    .group((变量:要分组的数据类型)=>{

            变量的操作

    })

    1. //分组 groupBy
    2. val stringList1: List[String] = List("hello", "world", "java", "world", "java", "world", "java", "hello", "hello", "spark", "flink", "hello", "spark", "flink")
    3. val map: Map[String, List[String]] = stringList1.groupBy((str: String) => {
    4. str
    5. })
    6. println(map)
    7. /**
    8. * Map(world -> List(world, world, world),
    9. * java -> List(java, java, java),
    10. * flink -> List(flink, flink),
    11. * spark -> List(spark, spark),
    12. * hello -> List(hello, hello, hello, hello))
    13. */
    14. map.foreach(println)
    15. /**
    16. * (world,List(world, world, world))
    17. * (java,List(java, java, java))
    18. * (flink,List(flink, flink))
    19. * (spark,List(spark, spark))
    20. * (hello,List(hello, hello, hello, hello))
    21. */

    1.3 Set

    1.List里面有的Set也有,但是Set是无序且唯一的

    1.3.1 交、并、差

    1.交:集合1名.&(集合2名)

    集合1名 & 集合2名 

    2.并

    集合1名.|(集合2名)

    集合1名 | 集合2名

    3.差

    集合1名.&~(集合2名)

    集合1名 &~ 集合2名

    1. //交集,并集,差集
    2. val set2: Set[Int] = Set(1, 2, 3, 4, 5)
    3. val set3: Set[Int] = Set(3, 4, 5, 6, 7)
    4. //交集
    5. println(set2.&(set3))
    6. println(set2 & set3)
    7. println(set2.intersect(set3))
    8. //并集
    9. println(set2.|(set3))
    10. println(set2 | set3)
    11. //差集
    12. println(set2.&~(set3))
    13. println(set2 &~ set3)

    1.3.2 Set与List的转化

    1.List搭配Set自动去重相同的

    1. //转化
    2. val list1: List[Int] = List(88, 66, 22, 99, 11, 33, 110, 11, 22, 44, 22, 55, 11, 33)
    3. val set1: Set[Int] = list1.toSet
    4. println(set1)
    5. println(set1.toList)

    1.4 mutable 可变集合

    1.通过观察源码发现,不可变集合属于scala.collection.immutable中

    2.如果我们想要使用可变的集合,就要去scala.collection.mutable下找对应的集合进行使用

    1.4.1 ListBuffer

    1.创建ListBuffer   new ListBuffer[Int]

    2.添加元素

    集合名.append(元素)

    集合名.+=(元素)

    3.指定位置添加

    集合名.insert(索引,元素)

    4.添加列表

    集合名.++=(另一个集合名)

    1. //创建ListBuffer集合
    2. val listBuffer: ListBuffer[Int] = new ListBuffer[Int]
    3. //添加元素有两种方法
    4. listBuffer.append(1)
    5. listBuffer.append(2)
    6. listBuffer.append(3)
    7. listBuffer.+=(4)
    8. listBuffer.+=(4)
    9. println(listBuffer)
    10. println("="*100)
    11. //指定位置添加元素
    12. listBuffer.insert(2,9)
    13. println(listBuffer)
    14. println("="*100)
    15. //批量添加(添加另一个集合)
    16. val list: List[Int] = List(5, 6, 7, 8)
    17. listBuffer.++=(list)
    18. println(listBuffer)
    19. println("="*100)

    5.更新元素

    集合名.updata(索引,元素)

    这个没有返回值

    1. //更新元素
    2. listBuffer.update(1,10)
    3. println(listBuffer)
    4. println("="*100)

    6.指定下标删除元素

    列表名.remove(索引)

    7.从左向右删除第一个

    列表名.-=(元素)

    1. //删除元素
    2. //指定下标删除元素
    3. val i: Int = listBuffer.remove(1)
    4. println(i)
    5. println(listBuffer)
    6. println("="*100)
    7. //删除元素 从左向右,只会删除第一次出现的对应字符串
    8. println(listBuffer.-=(4))
    9. println("="*100)

    1.4.2 HashSet

    1.添加元素使用 add或者+=

    2.移除元素使用-=

    1.5 Tuple

    1.5.1 概念

    1.固定长度的集合,元素不是固定的,可以是任意值

    2.创建元组

    Tuple长度(元素的个数等于长度)

    或者直接   (元素)

    1. val tuple: (Int, Int, Int, Int, Int, Int) = Tuple6(1, 2, 3, 4, 5, 6)
    2. println(tuple)
    3. val tuple1: (Int, Int, Int, Int) = (11, 12, 13, 14)
    4. println(tuple1)

    1.5.2 获取元素

    println(tuple1._2)

    1.6 Map

    1.6.1 不可变Map

    1.创建Map

    1. //创建Map
    2. val map: Map[String, Int] = Map("1001" -> 18, "1002" -> 19, "1003" -> 20)

    2.通过键找值,getOrElse

    1. //通过键获取值
    2. println(map.get("1001"))//Some(18)
    3. //通过键获取值,如果没找到返回默认值
    4. println(map.getOrElse("1004", "没有这个元素"))//没有这个元素

    3.map方法:将Map的键值对变成一个二元元组,操作里面的键与值最后返回的还是Map

    注意最后匿名函数里面要返回一个二元元组

    1. val map2: Map[String, Int] = Map(("1001", 18), ("1002", 19), ("1003", 10), "1004" -> 15)
    2. //将每个年龄+1
    3. val map1: Map[String,Int] = map2.map((kv: (String,Int)) => {
    4. val key: String = kv._1
    5. val value: Int = kv._2
    6. (key,value+1)
    7. })
    8. println(map1)//Map(1001 -> 19, 1002 -> 20, 1003 -> 11, 1004 -> 16)

    4.获取所有的keys与values

    1. //获取所有的key
    2. val keys: Iterable[String] = map2.keys
    3. println(keys)
    4. val values: Iterable[Int] = map2.values
    5. println(values)

    1.6.2 可变Map

    1.添加元素

    .+=(())

    .put()

    1. //添加元素
    2. hashMap.+=(("xia",19))
    3. hashMap.put("mi",18)
    4. println(hashMap)

    2.删除元素

    只需要写一个键

    1. hashMap -= "xia"
    2. println(hashMap)

    1.7 Java与scala集合的转化

    1.7.1 Java->scala

    1.导入的包是  scala.collection.JavaConverters._

    1. //创建一个java中的集合
    2. val list1: util.ArrayList[String] = new util.ArrayList[String]()
    3. list1.add("java")
    4. list1.add("world")
    5. list1.add("hello")
    6. list1.add("spark")
    7. list1.add("java")
    8. // println(list1)
    9. /**
    10. * java集合->scala
    11. * 借助隐式转换,调用原本没有的功能
    12. */
    13. val scalaList: List[String] = list1.asScala.toList
    14. println(scalaList)

    1.7.2 Scala->java

    1. /**
    2. * scala中集合->java集合
    3. */
    4. val list2: List[Int] = List(1,2,3,4,5,6,7)
    5. val javaList: util.List[Int] = list2.asJava
    6. println(javaList)

    二 JCBC

    1.模板直接套

    1. package com.shujia.day02
    2. import java.sql.{Connection, DriverManager, PreparedStatement, ResultSet}
    3. object Demo19JCBC {
    4. def main(args: Array[String]): Unit = {
    5. /**
    6. * scala中连接数据库
    7. */
    8. //加载驱动
    9. Class.forName("com.mysql.jdbc.Driver")
    10. //创建与数据库连接对象
    11. val conn: Connection = DriverManager.getConnection("jdbc:mysql://192.168.73.100/bigdata29?useUnicode=true&characterEncoding=utf8&useSSL=false", "root", "123456")
    12. //为了防止sql注入
    13. val state: PreparedStatement = conn.prepareStatement("select id,job_name,company_name," +
    14. "salary,addr,experience,education,company_type from job_listing where education=?")
    15. state.setString(1,"本科")
    16. //执行sql语句
    17. val resultSet: ResultSet = state.executeQuery()
    18. while (resultSet.next()){
    19. val id: Int = resultSet.getInt("id")
    20. val job_name: String = resultSet.getString("job_name")
    21. val company_name: String = resultSet.getString("company_name")
    22. val salary: String = resultSet.getString("salary")
    23. val addr: String = resultSet.getString("addr")
    24. val experience: String = resultSet.getString("experience")
    25. val education: String = resultSet.getString("education")
    26. val company_type: String = resultSet.getString("company_type")
    27. println(id+job_name+company_name+salary+addr+experience+education+company_type)
    28. }
    29. //释放资源
    30. state.close()
    31. conn.close()
    32. }
    33. }

      三匹配模式

    3.1 基本数据类型

    1.自上而下匹配

    1. var i: Int = 100
    2. i match {
    3. case 10 => println("i的值是10")
    4. case 100 => println("i的值是100")
    5. case _ => println("i的值是其他")
    6. }

    3.2 匹配字符串

    1. //匹配字符串
    2. var str:String="java"
    3. str match {
    4. case "java"=>println("hello")
    5. case "spark"=>println("hh")
    6. case _=>println("ll")
    7. }

    3.3匹配元组

    1.元组不可变,只能case一个

    2.匹配的是数据类型

    1. //匹配元组
    2. //匹配的是数据类型
    3. val tuple: (Int, Int, Int) = (11, 12, 13)
    4. tuple match {
    5. case (x:Int,y:Int,z:Int)=>println(x+y+z)//36
    6. }

    3.4 匹配数组

    1.匹配的是数据类型

    2.可以匹配多个

    1. //匹配数组
    2. val array: Array[String] = Array("1001", "张三")
    3. array match {
    4. case Array(id:String,name:String)=>println(id+name)
    5. case Array(id:String,name:String,adr:String)=>println(id+name+adr)
    6. case _=>println("hello")
    7. }

    3.5 匹配匹配值的类型

    1. //匹配匹配值的类型
    2. val obj:Any=100
    3. obj match {
    4. case a:Int=>println("obj是Int类型")
    5. case b:String=>println("obj是String类型")
    6. case _=>println("obj是其他类型")
    7. }

    3.6 Map中的get方法

    1. val map: Map[String, String] = Map("1001" -> "张三", "1002" -> "李四")
    2. val str1: String = map.get("1007") match {
    3. case Some(x) => x
    4. case None => "默认值"
    5. }
    6. println(str1)
    7. //等同于
    8. val str2: String = map.getOrElse("1007", "默认值")
    9. println(str2)

    3.7 与函数一起用

    1.map函数中将小括号变成大括号

    1. val list: List[Array[String]] = Source
    2. .fromFile("scala/data/score.txt")
    3. .getLines()
    4. .toList
    5. .map((line: String) => {
    6. line.split(",")
    7. })
    8. list.map {
    9. case Array(id: String, _, score: String) => (id, score)
    10. }.foreach(println)
    11. //下面写法一样
    12. // val list: List[String] = Source.fromFile("scala/data/score.txt").getLines().toList
    13. // val list1: List[Array[String]] = list.map((line: String) => {
    14. // line.split(",")
    15. // })
    16. // val tuples: List[(String, String)] = list1.map {
    17. // case Array(id: String, _, score: String) => (id, score)
    18. // }
    19. // tuples.foreach(println)

    四 隐式转化

    4.1 隐式转化函数

    1.只针对参数类型和返回值类型,和隐式函数叫什么无关

    2.同一种参数和返回值类型组合的隐式转换函数,同一作用域下只能出现一种

    3.scala编译器,在编译代码的时候,会识别到需要将A类型转B类型,然后就去找参数是A类型,返回值是B类型的隐式转换函数,自动调用,否则找不到报错

    1. //定义一个fun函数
    2. def fun(i: Int): Unit = {
    3. println(i + 100)
    4. }
    5. //定义一个将参数类型变成跟返回值类型一样的隐式转化函数
    6. implicit def strToInt(s:String): Int = {
    7. Integer.parseInt(s)
    8. }
    9. // implicit def strToInt2(s:String): Int = {
    10. // Integer.parseInt(s)
    11. // }//出现报错因为同一种参数和返回值类型组合的隐式转换函数,同一作用域下只能出现一种
    12. fun("100")//200

    4.应用

    1. //应用
    2. import com.shujia.day02.Text1._
    3. val list: List[String] = "scala/data/students.csv".getLines().toList
    4. list.foreach(println)
    5. }
    6. //相当于
    7. val list1: List[String] = read("scala/data/students.csv").getLines().toList
    8. list1.foreach(println)
    9. }
    10. object Text1 {
    11. implicit def read(path: String): BufferedSource = {
    12. Source.fromFile(path)
    13. }
    14. }

    4.2 隐式转化类

    1.隐式转换类可以隐式的将类的构造函数参数类型转换成当前类的类型,自动调用构造方法创建对象

    1. package com.shujia.day02
    2. import scala.io.Source
    3. object Demo23Implicit {
    4. def main(args: Array[String]): Unit = {
    5. //普通方法
    6. val read = new Read("scala/data/students.csv")
    7. val list: List[String] = read.read()
    8. list.foreach(println)
    9. //隐式转化类方法
    10. val list1: List[String] = "scala/data/students.csv".read()
    11. list1.foreach(println)
    12. println("scala/data/students.csv".p("j"))
    13. }
    14. implicit class Read(path:String){
    15. def read(): List[String] = {
    16. Source.fromFile(path).getLines().toList
    17. }
    18. def p(str: String): String = {
    19. str + path
    20. }
    21. }
    22. }

    4.3 隐式转化变量

    1. package com.shujia.day02
    2. object Demo24Implicit {
    3. def main(args: Array[String]): Unit = {
    4. def add(x:Int)(implicit y:Int):Int={
    5. x+y
    6. }
    7. implicit val i:Int=100
    8. //正常传值
    9. println(add(2)(100))
    10. //使用隐式转化变量
    11. println(add(2))
    12. }
    13. }

  • 相关阅读:
    第九章、类的生命周期
    ArcGIS:如何制作数据统计图?
    罗汉果甜苷V/益生菌修饰卵清蛋白 Mogroside V/probiotics-OVA
    jQuery实现动画登录页面+表单验证+数据采用localStorage本地储存
    Idea中查看SpringSecurity各Filter信息
    看完这篇 教你玩转渗透测试靶机vulnhub——FunBox1
    kafka集群及副本的概念
    汇总区间(C++解法)
    《基于FPGA的数字信号处理》专栏的导航与说明
    dbeaver连接国产数据库
  • 原文地址:https://blog.csdn.net/weixin_65909965/article/details/139078249