SCALA-DAY02(scala-day02)(scala day02)

1 方法和函数

1.1 方法的使用细节 

1.2 函数的使用细节

1.3 函数作为参数传递

package com._51doit.day02.demo.function_method

/**
 * FileName: Demo2
 * Author:   多易教育-DOIT
 * Date:     2020/10/31 0031
 * Description: 
 */
object Demo2 {
  /**
   * 方法和函数实现一样的功能
   * 函数  可以单独存在  可以作为参数 或者是返回值  简洁  灵活
   */
  /**
   * 方法两个参数
   *
   * @param x int值
   * @param f 函数  处理Int 返回Int
   * @return
   * opt方法对Int数据处理的逻辑的灵活的多变的  取决于传入的f
   */
  def opt(x: Int, f: Int => Int): Int = {
    // 使用函数 处理参数一  , 传入不同的函数 处理方式不同
    f(x)
  }
  val f = (x:Int)=>{
    x*x
  }
  def main(args: Array[String]): Unit = {
    println(opt(12, f))
   /* println(opt(12, x => x * x))
    println(opt(12, x => x * x * x))*/
    //  参数二   类
   // Collections.sort(list , new Com)
  }

}

1.4 函数和方法总结 

package com._51doit.day02.demo.function_method

/**
 * FileName: BinarySearch
 * Author:   多易教育-DOIT
 * Date:     2020/10/31 0031
 * Description: 
 */
object BinarySearch {
  /**
   * 参数一  数组
   * 参数二  要找的元素
   * 返回  元素的位置
   *     binary(arr , e){
   *        //定义起始点  和结束点
   *        var start =0
   *        var end = arr.len
   *        while(){
   *          var  mid = (start+end) / 2
   *          if(arr(mid)==e)  return  mid
   *          else if(arr(mid)>e)   end = mid -1
   *        }
   *     }
   * @param arr
   * @param e
   */
  def binarySearch(arr: Array[Int], e: Int): Int = {
    // 如果数组中没有元素  返回
    if (arr.length <= 0) {
      return -1
    }
    var start = 0
    var end = arr.length - 1
    var res = -1
    while (start <= end) {
      var mid = (start + end) / 2
      if (arr(mid) == e) {
        res = mid
        return res
      }else if(arr(mid)>=e){ // 要找的元素在中间值的左边
        end = mid -1
      }else{
        start = mid+1
      }
    }
      res
  }

  def main(args: Array[String]): Unit = {

    println(binarySearch(Array(1, 3, 5, 7, 9, 10, 23, 56, 78), 100))

  }
}

1.5 函数和方法转换 

方法和函数都能实现一样的功能 , 那么函数可以作为参数传递 , 方法不能 ,

如果我们有某种功能的方法  , 没有这种功能的函数   如果想使用处理逻辑作为参数那么必须写一个一样功能的函数 

其实方法可以转换成函数  方法名 _ 

opt("hello",m) 将方法传入参数  底层直接将方法转换成函数  

/**
 * FileName: Demo3
 * Author:   多易教育-DOIT
 * Date:     2020/10/31 0031
 * Description:
 * 函数可以作为方法的参数
 */
object Demo3 {
  /**
   * 函数
   */
 val f =  (str:String)=>{
    str.toUpperCase
  }

  /**
   * 方法
   * @param str
   * @return
   */
  def m(str:String):String={
    str.toUpperCase
  }
  val f2 =  m _
  /**
   * 方法 参数二 函数
   * @param str
   * @param f
   * @return
   */
  def opt(str:String , f :String=>String): String ={
    f(str)
  }

  def main(args: Array[String]): Unit = {
    println(opt("hello", f))
    // 方法不能单独存在
    // 在底层将方法传入参数的时候会将方法转换成函数
    println(opt("hello", m))

  }
}

2 集合 

scala中的集合分为两种 ,可变集合和不可变集合, 不可变集合可以安全的并发的访问!

集合的类主要在一下两个包中

  1. 可变集合包   scala.collection.mutable 
    2) 不可变集合包 scala.collection.immutable   默认的

scala默认使用的是不可变的集合 , 因此使用可变的集合需要导入可变集合的包

scala的集合主要分成三大类

  1. Seq 序列
  2. Set 不重复集
  3. Map 键值映射集

注意: 所有的集合都继承自Iterator迭代器这个特质

2.1 数组

package com._51doit.day02.demo.array

/**
 * FileName: ArrayDemo1
 * Author:   多易教育-DOIT
 * Date:     2020/10/31 0031 
 * Description:
 * 1 数组的定义
 * 2 数组默认是不可变的(长度)
 *   2.1 不可变的数组中的元素可变    arr1(index) = newvalue
 */
object  ArrayDemo1 {
  def main(args: Array[String]): Unit = {
    // 数组的定义
    val arr1: Array[Int] = Array(1, 2, 3, 4)
    val arr2: Array[String] = Array[String]("hello", "hi", "zaima", "gun")
    // 给数组的元素再赋值
    arr1(1) = 100
    arr1.foreach(println)  // 1  100 3  4
  // val newArr: Array[Int] = arr1.drop(2) //  从头删除n个
   // newArr.foreach(println)
  }

}
package com._51doit.day02.demo.array

import com._51doit.day02.demo.pojo.User

/**
 * FileName: SortDemo
 * Author:   多易教育-DOIT
 * Date:     2020/10/31 0031 
 * Description: 
 */
object SortDemo {
  def main(args: Array[String]): Unit = {
    val users = Array(
      User(1,"yangmi",32),
      User(2,"yangying",30),
      User(3,"yangguo",722),
      User(4,"yangyang",39),
      User(5,"yshulin",18),
    )
   // users.sorted
  // val res: Array[User] = users.sortBy(user => user.name)
    /**
     * User(3,yangguo,722)
     * User(1,yangmi,32)
     * User(4,yangyang,39)
     * User(2,yangying,30)
     * User(5,yshulin,18)
     */
    val res: Array[User] = users.sortWith((u1, u2) => u1.name > u2.name)
    res.foreach(println)
  }

}
package com._51doit.day02.demo.array

/**
 * FileName: ArrayDemo3
 * Author:   多易教育-DOIT
 * Date:     2020/10/31 0031
 * Description: 
 */
object ArrayDemo3 {
  def main(args: Array[String]): Unit = {
    val arr = Array("a" , "c" ,"n")
    //val arr2: Array[String] = arr.:+("xxxx")
    val arr2: Array[String] = arr:+("xxxx") // list集合
    val ints1 = Array(1,3,5,7)
    val ints2 = Array(2,4,6,8)
   // val ints3: Any = ints1.:++ ints2 //
    val tuples: Array[(String, Int)] = arr.zip(ints1)
    tuples.foreach(e=>print(e+" "))
  }
}

 可变数组 : 数据的长度可变

可变数组需要导包   导包的方式是
/*import scala.collection.mutable.ArrayBuffer*/
import scala.collection.mutable._
package com._51doit.day02.demo.array

/*import scala.collection.mutable.ArrayBuffer*/
import scala.collection.mutable._

/**
 * FileName: ArrayBuffer
 * Author:   多易教育-DOIT
 * Date:     2020/10/31 0031
 * Description: 可变的数组
 * 1 定义
 *    1.1     val b = new ArrayBuffer[String]()
 *    1.2 ArrayBuffer[Int](1,2,3,4)
 * 2  append   追加元素
 * 3 +=(ele)  添加一个元素 
 * 4 -=(ele)  删除最后一个元素
 * 5 ++=   --=  合并移除一个数组
 * 6 remove(1 ,2) 参数一 index 参数二 从此开始删除个数
 *   remove(1)  参数是index
  */
object ArrayBufferDemo1 {
  def main(args: Array[String]): Unit = {
    // 1 定义可变数组
    val b = new ArrayBuffer[String]()
    // 添加元素
    b.append("tom1")
    b.append("tom2")
    println(b.length)
    b.foreach(println)
   // 定义可变数据组   可以初始值
    val arr1: ArrayBuffer[Int] = ArrayBuffer[Int](1, 3, 5, 7, 9)
    val arr2: ArrayBuffer[Int] = ArrayBuffer[Int](2,4,6,8)
    arr1++=arr2
    arr1.foreach(e=>print(e+" "))
    println()
    arr1.remove(1)
    arr1.foreach(e=>print(e+" "))

 /*   arr.append(2)
    arr+=(100)
    arr-=(5)
   arr.foreach(e=>print(e+" "))*/
  }
}

2.2 list

不可变list

package com._51doit.day02.demo.list

/**
 * FileName: ListDemo1
 * Author:   多易教育-DOIT
 * Date:     2020/10/31 0031
 * Description: List集合 在Seq
 * 可变的
 * 不可变的
 * 1 定义  1) List(1, 2, 3, 4, "jim", "tom")
 *        2) list = "JAVA" :: "JS" :: Nil
 * 2 :+
 * 3 ++
 * 4 take(n) 从前面获取n个元素  返回新的list
 * 5 takeRight
 * 6 ls1.length  ls1.size  长度
 * 7 isEmpty
 * 8 list集合的取值 *****  ls1(index)
 * 9 distinct
 */
object ListDemo1 {
  def main(args: Array[String]): Unit = {
    // 不可变list
    // 定义 1
    val ls1 = List(123 , 34,34)
    val string: String = ls1.mkString("--")
    println(string)
    val ls2 = List[Any](1, 2, 3, 4, "jim", "tom")
    val ls: List[Any] = ls1.distinct
    println(ls)
    val ls3 = List[Int](1, 2, 3, 4)
    // 定义方式 2
    val list = "JAVA" :: "JS" :: Nil
    val newls: List[Any] = ls1 :+ ("jack")
    val newls2: List[Any] = ls2 ++ ls3  //  ++
    val newls3: List[Any] = ls2.take(2)
    val newls4: List[Any] = ls2.takeRight(2)
    val b: Boolean = ls1.isEmpty
    println(ls1(0))
    if(b)println("空集合")
     //if(ls1.length==0)println("空集合")

    newls4.foreach(e=>print(e+" "))

  //  val str: String = ls1 + ("cat") // List(1, 2, 3, 4, jim, tom)c


  }

}

可变List

package com._51doit.day02.demo.list

import scala.collection.mutable.ListBuffer

/**
 * FileName: ListBufferDemo
 * Author:   多易教育-DOIT
 * Date:     2020/10/31 0031
 * Description:
 *  1 可变list集合的定义ListBuffer(1, 2, 3, 4)
 *  2 append(elements:Int*)  可变参数的方法
 */
object ListBufferDemo {
  def main(args: Array[String]): Unit = {
    val ls = List(1, 2, 3)
    val lb1: ListBuffer[Int] = ListBuffer(1, 2, 3, 4)
    val lb2: ListBuffer[Int] = ListBuffer(3, 4,5,6)
    //ls += 12
    /*lb1 += 23
    println(lb1)
    lb1-= 3
    println(lb1)
    lb1++=lb2
    println(lb1)
    lb1--=lb2*/
    lb1--=lb2  // 除去交集
    lb1.append(11,22,33)
   // lb1.remove()
    lb1.append()
    println(lb1)


  }

}

可变参数的方法

(str:String*)

package com._51doit.day02.demo.list

/**
 * FileName: ArgsDemo
 * Author:   多易教育-DOIT
 * Date:     2020/10/31 0031
 * Description:
 * (String...str)
 * str:String*
 * 可变参数的方法只能有一个可变列表且在列表的最后
 */
object ArgsDemo {
  def m(x:Int , str:String*): String ={
    var res:String = ""
    for (elem <- str) {
      res+=elem
    }
    res
  }

  def main(args: Array[String]): Unit = {
    println(m("hello", "world", "jim"))


  }

}

2.3 元组

组  (String,Int,String) 替代 Bean来简化数据的封装
       操作某个位置的数据和操作bean的属性一样方便

元祖的定义

元组的取值

元组的遍历

元组的嵌套  取值 

对偶元组 

对偶元组反转

package com._51doit.day02.demo.tuple

/**
 * FileName: TupleDemo1
 * Author:   多易教育-DOIT
 * Date:     2020/10/31 0031
 * Description:
 * 元组  (String,Int,String) 替代 Bean来简化数据的封装
 *             操作某个位置的数据和操作bean的属性一样方便
 *  只能存储22个元素
 *   1 元组的定义
 */
object TupleDemo1 {
  def main(args: Array[String]): Unit = {
    // 1 元组的定义
    val tp = new Tuple4(1, 2, 3, 4)
    val tuple: (String, Int, Int, String, Boolean) = ("tom", 1, 3, "jim", true)
   // println(tp._3)
  //  println(tuple._4)
    // 遍历每个元素
    val iterator: Iterator[Any] = tuple.productIterator
    iterator.foreach(println)
    //2 元组嵌套
    val tuple1: ((Int, Int, Int, Int), (Int, Int, Int, Int, Int, Int, Int)) = ((1, 2, 3, 4), (2, 3, 4, 5, 6, 7, 8))
    //3 对偶元组 (k,v)(k,v)(k,v)(k,v)
    val tuple2 = (("zss", 23), ("lss", 33))
    tuple2._2._1  //lss
    //4  拉链操作
    val mps  = Array("em" , "sl" , "wd" ,"kl","xiaoyao" , "gb")
    val ps = Array("zhiruo" ,"wukong","zsf","taoge","xingge")
    val arr: Array[(String, String)] = mps.zip(ps)
    arr.foreach(println)
    val tuple3: (String, (String, String, String, String)) = ("sl", ("ts", "zbj", "ss", "wk"))
   

  }

}

2.4 set

2.5 map

Map的定义

package com._51doit.day02.demo.map

/**
 * FileName: MapDemo1
 * Author:   多易教育-DOIT
 * Date:     2020/10/31 0031
 * Description:
 * 1 Map的定义
 *  1)
 *  2)
 * 2 get(key)
 * 3 getOrElse 参数一 key 参数二  没有key value的默认值
 * 4 mp.keys 获取所有的key
 * 5 根据key获取所有的value
 * 6 mp2.values
 * 7 mp.toList
 */
object MapDemo1 {
  def main(args: Array[String]): Unit = {
    // Map 定义1
    val mp = Map[String ,Int](("zss", 23), ("lss", 33), ("ww", 21))
    //定义2
    val mp2 = Map[String , String]("sl" -> "fsy", "em" -> "zhir", "wd" -> "zsf")
    // map转换成集合  对偶元组的list集合
    val ls: List[(String, Int)] = mp.toList
    ls.foreach(tp=>{
      println(tp._1)
    })


   /* val values: Iterable[String] = mp2.values
    values.foreach(println)*/

   /* val keys: Iterable[String] = mp.keys
    keys.foreach(k=>{
      val op: Option[Int] = mp.get(k)
      println(op.get)
    })*/


   // println(str)
    // 根据key取取值  1) Some(v)  2) None
   /* val op: Option[Int] = mp.get("zs2s")
    if(op.isDefined){// Some
      val res: Int = op.get
      println(res)
    }*/
    // 判断
   /* if(op!=None){
      val res: Int = op.get
      println(res)
    }*/

  }

}

Map的遍历

 val keys1: Iterable[String] = mp.keys
    val values1: Iterable[Int] = mp.values
    //根据key获取所有的value
    val keys: Iterable[String] = mp.keys
    keys.foreach(k=>{
      val v: Int = mp.get(k).get
      println(s"key:${k} , value:$v")
    })
 val ls: List[(String, Int)] = mp.toList
    ls.foreach(tp=>{
      println(s"key:${tp._1} - value: ${tp._2}" )
    })
for (elem <- mp) {
      print(elem._1+" ")
      print(elem._2)
      println()
    }
 for ((k,v) <- mp) {
      println(s"$k - $v")
    }

 for ((_,v) <- mp) {
      println(s"$v")
    }
    for ((k,_) <- mp) {
      println(s"$k")
    }
  // 第五种
    mp.map(tp=>{
      val k: String = tp._1
      val v: Int = tp._2
      
    })
    // 第六种
    mp.foreach(tp=>{
      val k: String = tp._1
      val v: Int = tp._2
    })
package com._51doit.day02.demo.map

/**
 * FileName: MapDemo3
 * Author:   多易教育-DOIT
 * Date:     2020/10/31 0031
 * Description:
 * 不可变的Map和可变的Map名字一样 只能使用包名区分
 * 默认是不可变集合
 * mutable.Map[Int,Int]()  put
 */
object MapDemo3 {
  def main(args: Array[String]): Unit = {
    import  scala.collection._
    // 可变的map  put
    val map = mutable.Map[Int,Int]()
    map.put(1,3)
    // 不可变的Map
    val mp = immutable.Map[String, Int](("zss",11))
    val map1 = new mutable.HashMap[String, Int]()
    map1.put("a",22)
    map1.put("a",23)
    map1.put("b",23)
    map1.remove("")
    map1.keySet
    map1.foreach(println)
  }
}

猜你喜欢

转载自blog.csdn.net/qq_37933018/article/details/109399381