scala-day02_ (函数,集合,元组,map集合)

scala (函数,集合,元组,map集合,单词统计)

scala面向函数编程,lambda表达式
package com.wt.day02
import scala.language.postfixOps

/**
 * @author WangTao
 * @date 2022/7/8 18:00
 */
object Demo11Fun {
  def main(args: Array[String]): Unit = {
    /**
     * 面对对象编程 - 将对象穿来穿去
     * 1. 以对象作为参数
     * 2. 以对象作为返回值
     * 需要明确参数的类型,返回值的类型和对象的类型 - 可以使用多态(父类的引用指向子类的对象)
     *
     * 面向函数编程, - 将函数传来传去 - 高阶函数
     * 1. 以函数作为参数 (必须要很熟练)
     * 2. 以函数作为返回值,(了解)
     *
     * 函数的类型 = 由参数的类型和返回值类型决定
     * strToInt 是一个参数为String 返回值为Int类型的函数
     *
     * 函数类型的表示 :String => Int 前面的是参数类型,后面的为返回值类型
     *
     */
    def strToInt(str: String): Int={
      str.toInt
    }

    val i: Int = strToInt("1000")
    println(i)

    //scala中函数也是一个对象,可以改变引用
    val strToStringTemp: String => Int = {
        strToInt
    }

    val j: Int = strToStringTemp("200")
    println(j)

    print("="*100)

    /**
     * 1. 函数作为参数
     *
     * fun的参数是一个函数,(是一个参数为String返回值为Int类型的函数)
     *
     * 以函数作为参数编程的作用--- 我们可以将一个代码逻辑中需要变化的部分抽象出来,让调用者以函数的形式传递进来
     */

    //定义一个参数为函数的函数
    def fun(f:String => Int): Unit ={
      println("执行fun函数")
      //调用传进来的函数
      println("调用f")
      val i: Int = f("100")
      println(i)
    }

    //f1是一个参数为String 返回值为Int类型的函数
    def f1(str: String): Int = {
      println("执行f1")
      str.toInt
    }
    println("调用fun函数")
    fun(f1)

    def fun2(str: String):Int = {
      str.toInt +666
    }
    fun(fun2)
    /**
     * lambda 表达式 (匿名函数:没有名字的函数)
     * (s:String)=> s.toInt
     *
     *前面是参数,后面是函数体和返回值,默认最后一行作为返回值
     *
     * lambda表达式返回值的类型会自动推断
     */
    //使用lambda表达式作为函数的参数
    fun((str: String) =>{
      str.toInt
    })
    //函数只有一行时可以省略括号
    fun((str: String) => str.toInt)
    //lambda表达式的参数类型可以自动推断
    fun(f => f.toInt)
    //如果参数只使用了一次可以使用下划线代替
    fun(_.toInt)
  }
}
scala中的foreach
package com.wt.day02

/**
 * @author WangTao
 * @date 2022/7/8 18:49
 */
object Demo12Fun {
  def main(args: Array[String]): Unit = {
    /**
     * 以函数作为参数的应用
     */
    val array: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8)

    /**
     * foreach:循环数组中的元素一个一个传递给后面的函数
     *
     * Any:相当于Java中的object
     */
    def f(i: Int): Unit = println(i)

    array.foreach(f)

    println("=" * 100)

    //lambda表达式
    array.foreach((i: Int) =>println(i))
    println("=" * 100)
    //简写
    array.foreach(i => println(i))
    println("=" * 100)
    //简写
    array.foreach(println(_))
  }

}
scala函数作为返回值,函数函数柯里化
package com.wt.day02
/**
 * @author WangTao
 * @date 2022/7/8 19:03
 */
object Demo13Fun {
  def main(args: Array[String]): Unit = {
    /**
     * 2. 以函数作为返回值
     *
     */
    //这么写没有任何意义,只是表名函数可以即作为参数又可以返回值
    def fun(f: String => Int): String => Int ={
      println("fun")
      f
    }

    /**
     *   fun参数和返回值都是哟个函数
     *   参数为一个参数为String返回值为Int类型的函数
     *   返回值为一个参数为String返回值为Int类型的函数
     *
     */

    val function:String => Int =fun((s:String) => s.toInt)

    def fun1(str: String):String => Int = {
      //定义一个参数为String返回值为Int类型的函数
      def f(s: String): Int={
        //在函数内使用函数外的变量叫做 闭包
        s.toInt + str.toInt
      }
      //返回一个函数
      f
    }

    //调用fun1函数,传入一个字符串
    val stringToInt: String => Int = fun1("100")
    println(stringToInt)
    //再次调用返回的函数,再次传入一个字符串
    val i: Int = stringToInt("20")
    println(i)

    //简化fun1函数调用的过程
    val i1: Int = fun1("66")("22")
    println(i1)

    /**
     *  简写上面的函数 --函数柯里化
     */

    def fun2(str:String)(s:String): Int ={
      str.toInt + s.toInt
    }

    val i2: Int = fun2("1000")("2")
    println(i2)

    //可以先传递一个参数,后面的参数可以传递很多次,提高了代码的复用性
    val fun3: (String => Int) = fun2("100")

    println(fun3("1"))
    println(fun3("2"))
    println(fun3("3"))
    println(fun3("4"))

    /**
     * 偏应用函数
     *
     */
    //调用函数的时候可以直传一部分参数,返回一个函数,调用返回的函数后,在传一部分的函数
    //下划线是占位符的作用
    val fun5: String => Int = fun2("1")(_)
    println(fun5("2"))
    println(fun5("3"))
    println(fun5("4"))
    println(fun5("5"))
  }
}
scala 中使用Java中的集合
package com.wt.day02
import java.util
/**
 * @author WangTao
 * @date 2022/7/8 19:38
 */
object Demo14JavaList {
  def main(args: Array[String]): Unit = {
    /**
     * 在Scala中可以使用Java的集合
     */
    val list: util.ArrayList[Int] = new util.ArrayList[Int]

    list.add(1)
    list.add(3)
    list.add(5)
    list.add(6)
    list.add(9)
    println(list)
    //通过下标获取到对应的值
    println(list.get(3))
    /*
        增强for循环本质上是使用迭代器进行循环
        Scala和Java使用的是不同的迭代器,所有java的集合在scala语言中不能使用增强for循环进行遍历
     */

    //可以使用以下的迭代器
    var i = 0
    while(i < list.size()) {
      println(list.get(i))
      i += 1
    }
  }

}
scala 中的List集合(重点)
package com.wt.day02
/**
 * @author WangTao
 * @date 2022/7/8 19:56
 */
object Demo15List {
  def main(args: Array[String]): Unit = {
    /**
     * scala集合
     * 1. List:有序,不唯一
     * 2. Set:  无序,唯一
     * 3. Map:  kv格式,key是唯一的
     * 4. Tuple:元组,固定长度的集合
     */
    /**
     * List集合
     * Scala的集合比Java的集合好用了很多的方法
     */
    //不可变的List
    val list = List(1, 2, 3, 4, 5, 6, 7, 6, 4, 2)
    //通过下标获取元素
    println(list(3))
    //获取第一个元素
    println(list.head)
    //获取最后一个元素
    println(list.last)
    //获取不包含第一个的所有的元素
    println(list.tail)
    //将集合中的元素拼接成一个字符串
    val str: String = list.mkString("|")
    println(str)
    //反转,返回一个新的list
    println(list.reverse)
    //取前面n个元素
    println(list.take(4))
    //取后面几个元素
    println(list.takeRight(4))
    //去重
    println(list.distinct)
    //求和,集合元素的类型必须是可以求和的类型
    println(list.sum)
    //取最大值
    println(list.max)
    //取最小值
    println(list.min)

    println("=" * 100)

    /**
     * foreach : 循环集合,将集合一个一个传递给后面的函数,foreach没有返回值
     *
     */
    def pr(i: Int): Unit = println(i)
    list.foreach(pr)

    list.foreach((i:Int)=>println(i))

    //方式二
    var sum = 0
    //循环统计总和
    list.foreach((i: Int) =>{
       sum += i
    })
    println(sum)

    println("=" * 100)
    /**
     * 给每一个元素添加一(处理集合中的元素)
     */
    for (elem <- list) {
      println(elem +  10)
    }

    /**
     * map:循环集合,将集合中的元素一个一个传递给后面的函数,函数的返回值构建出一个新的函数
     * i:代表的是结合中的所有元素
     */
    println("=" * 100)
    val list1: List[Int] = list.map((i: Int) => i + 1)
    println(list1)

    println("=" * 100)

    /**
     * 处理集合中的元素,偶数加1,奇数乘以2
     */
    val list2: List[Int] = list.map((i: Int) => {
      if (i % 2 == 1) {
        i * 2
      } else {
        i + 1
      }
    })
    println(list2)

    /**
     * 取出集合中的奇数
     * Filter:循环集合,将集合中的元素一个一个传递给后面的函数
     * 如果函数为true保留数据,如果函数返回false则过滤数据
     */
    val list3: List[Int] = list.filter((i: Int) => i % 2 == 1)
    println(list3)

    println("=" * 100)
    /**
     * 将一行中的多个单词拆分出来,一个单词占一行
     */
    val lineList: Seq[String] = List("java,spark,hadoop","datax,scala,java", "hadoop,hive,sqoop")
    for(line <- lineList){
      val split: Array[String] = line.split(",")
      for (word <- split) {
        println(word)
      }
      //或者这样写
      line.split(",").foreach((str: String) => println(str))
    }
    println("=" * 100)

    /**
     * flatmap:循环集合中的函数,将函数一个一个传递给后面的函数
     * 函数返回一个集合,flatmap会将返回的集合拆分出来构建成一个新的集合
     */
    val strings: Seq[String] = lineList.flatMap((str: String) => str.split(","))
    strings.foreach((s:String) => println(s))

    println("=" * 100)

    /**
     * 多集合排序
     * sortBy:需要指定一个排序的字段,默认是升序
     * sortWith:指定一个排序的比较规则
     */
    val list4 = List(1, 2, 4, 5, 7, 8, 5, 4, 34, 65, 67, 33, 454, 666, 456, 345, 345)
    //如果是-i就是降序,如果是 i就是升序
    val ints: List[Int] = list4.sortBy((i: Int) => -i)
    ints.foreach(println)

    println("=" * 100)

    /**
     * groupBy:分组,需要指定分组的字段
     */
    val words = List("java", "spark", "java", "java", "spark", "hadoop")
    val groupByList: Map[String, List[String]] = words.groupBy((word: String) => word)
    groupByList.foreach(println)
  }
}
scala 中的set集合
package com.wt.day02
/**
 * @author WangTao
 * @date 2022/7/8 21:28
 */
object Demo16Set {
  def main(args: Array[String]): Unit = {
    /**
     * Set集合,无序,唯一
     * set集合比List集合少了排序的方法,其它的方法基本一致
     */
    val set = Set(1, 2, 3, 4, 5, 6, 7, 8, 9)
    println(set)
    println(set.mkString("\t"))
    set.foreach(println)

    println("=" * 100)

    val s1 = Set(1, 2, 3, 4, 5)
    val s2 = Set(3, 4, 5, 6, 7)
    println(s1 & s2) //交集
    println(s1 | s2) //并集
    println(s1 &~ s2) //差集

    /**
     * 集合之间的相互转换
     */

    val list = List(1, 2, 2, 3, 2, 1, 2, 4, 5, 6, 7, 8)
    println(list)
    println("==========================")
    val set1: Set[Int] = list.toSet
    set.foreach(println)
  }
}
scala 中的可变集合
package com.wt.day02
import scala.collection.mutable
import scala.collection.mutable.ListBuffer
/**
 * @author WangTao
 * @date 2022/7/8 21:34
 */
object Demo17Mutable {
  def main(args: Array[String]): Unit = {
    /**
     * 可变集合
     * ListBuffer:List有的方法ListBuffer都有,只是ListBuffer是可以改变的
     *
     */
    val listBuffer = new ListBuffer[String]
    //增加元素
    listBuffer.+=("java")
    listBuffer +=("hadoop")
    listBuffer +=("scala")
    listBuffer +=("linux")
    listBuffer +=("flume")
    println(listBuffer)

    //删除元素
    listBuffer -= ("java")
    println(listBuffer)

    //使用下标删除元素
    listBuffer.remove(3)
    println(listBuffer)

    //批量添加元素
    listBuffer ++= List("dfaag","SDFF","sdgafa")
    println(listBuffer)

    //更新元素
    listBuffer.update(2,"哮天犬")
    println(listBuffer)

    /**
     * 可变Set
     *
     */

    val hashSet = new mutable.HashSet[Int]()

    //增加元素
    hashSet += 1
    hashSet += 2
    hashSet += 3
    hashSet += 4
    hashSet += 5

    println(hashSet)

    //删除元素
    hashSet -= 1
    println(hashSet)
  }
}
scala 中的元组
package com.wt.day02
/**
 * @author WangTao
 * @date 2022/7/8 21:42
 */
object Demo18Tuple {
  def main(args: Array[String]): Unit = {
    /**
     * 元组:固定长度集合
     * 可以通过下划线加上下标获取数据, 可以避免下标越界异常
     *
     * 元组最多只能存22个元素
     */
    //val tuple: (Int, Int, Int, Int, Int, Int) = Tuple6(1, 2, 3, 4, 5, 7)

    //简写
    val tuple = (1,2,3,4,5,6)
    println(tuple._4)
  }
}
scala 中的map集合
package com.wt.day02
import scala.collection.mutable
/**
 * @author WangTao
 * @date 2022/7/8 21:52
 */
object Demo19Map {
  def main(args: Array[String]): Unit = {
    /**
     * map:kv格式的集合
     *
     */
    val map: Map[String, Int] = Map(("001", 23), ("002", 24), "003" -> 25)
    println(map)
    //可以通过key获取value
    val value: Int = map("002")
    println(value)

    //如果不存在key就返回默认值
    val age: Int = map.getOrElse("004", 0)
    println(age)

    /**
     * 给每一个人的年龄加一
     *
     * map集合的map方法,函数的参数是哟个二元组
     *
     * 返回一个新的map
     */

    val addAge: Map[String, Int] = map.map((kv: (String, Int)) => {
      val id: String = kv._1
      val age: Int = kv._2
      (id, age + 1)
    })
    println(addAge)

    /**
     * 可变map集合
     */
    val hashMap = new mutable.HashMap[String, String]

    //插入元素
    hashMap += "001" -> "张三"
    hashMap += "002" -> "李四"
    hashMap += "003" -> "王五"
    println(hashMap)

    //如果key存在自动覆盖
    hashMap += "003" -> "赵六"
    println(hashMap)

    //删除元素
    hashMap.remove("003")
    hashMap -= "002"
    println(hashMap)

  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值