zoukankan      html  css  js  c++  java
  • day25scala



    PS:
    1.scala是开发spark平台的一种语言。
    2.如果开发spark的话,用scala开发是非常好的,Python的话一般,用java的话就是效果不好。


    ---------------------------Scala的安装配置

    PS:首先必须要有java环境

    1.安装scala的2.10.5

    PS:文件中的内容,object保存着所有的静态方法和变量
    object HelloScala{ def main(args:Array[String]){ println(
    "i love you scala") } }

    PS:编写scala不能用这么笨的方法,需要专业的工具,安装插件如下图

    https://blog.csdn.net/iamlihongwei/article/details/72783459?locationNum=10&fps=1

    1. Scala基础

    1.1. 声明变量

    PS:无需指定类型,系统会自动识别

    package cn.itcast.scala

    /**
      * Created by ZX on 2015/11/6.
      */
    object VariableDemo {
      def main(args: Array[String]) {
        //使用val定义的变量值是不可变的,相当于java里用final修饰的变量
        val i = 1
        //使用var定义的变量是可变得,在Scala中鼓励使用val
        var s = "hello"
        //Scala编译器会自动推断变量的类型,必要的时候可以指定类型

        //变量名在前,类型在后
        val str: String = "itcast"
      }
    }

     

    1.2. 常用类型

    ScalaJava一样,有7种数值类型ByteCharShortIntLongFloatDouble(无包装类型)和一个Boolean类型

    PS:没有包装类

    1.1. 条件表达式

    Scala的的条件表达式比较简洁,例如:

    package cn.itcast.scala

    /**
      * Created by ZX on 2015/11/7.
      */
    object ConditionDemo {
      def main(args: Array[String]) {
        val x = 1
        //判断x的值,将结果赋给y
        val y = if (x > 0) 1 else -1
        //打印y的值
        println(y)

        //支持混合类型表达式
        val z = if (x > 1) 1 else "error"
        //打印z的值
        println(z)

        //如果缺失else,相当于if (x > 2) 1 else ()
        val m = if (x > 2) 1
        println(m)

        //在scala中每个表达式都有值,scala中有个Unit类,写做(),相当于Java中的void
        val n = if (x > 2) 1 else ()
        println(n)

        //if和else if
        val k = if (x < 0) 0 else if (x >= 1) 1 else -1
        println(k)
      }
    }

     

    ----------------------------------------------------------------------------------------------------------------------------------

    1.1. 块表达式

    PS:就是复杂好看点

    package cn.itcast.scala

    /**
      * Created by ZX on 2015/11/7.
      */
    object BlockExpressionDemo {
      def main(args: Array[String]) {
        val x = 0
        //在scala中{}中课包含一系列表达式,块中最后一个表达式的值就是块的值
        //下面就是一个块表达式
        val result = {
          if (x < 0){
            -1
          } else if(x >= 1) {
            1
          } else {
            "error"
          }

        }
        //result的值就是块表达式的结果
        println(result)
      }
    }

     

    PS:选择Scala->Scala,然后选择项目

     

    PS:系统有两个setting,第一个setting仅对项目修改,第二个对整个软件修改。 
    PS:创建时有class是类,object是单例对象,Trait 相当于接口

    ------------------------------------------------------------------

    PS: 1 to 10会自动赋值给res1,这个res是自动生成的

    1.1. 循环

    scala中有for循环和while循环,用for循环比较多

    for循环语法结构:for (i <- 表达式/数组/集合)

    1.until包头不包尾            是为了打印数组角标

    2.会根据不同结构类型动态的识别

    package cn.itcast.scala

    /**
      * Created by ZX on 2015/11/7.
      */
    object ForDemo {
      def main(args: Array[String]) {
        //for(i <- 表达式),表达式1 to 10返回一个Range(区间)

        //每次循环将区间中的一个值赋给i
        for (i <- 1 to 10)
          println(i)

        //for(i <- 数组)
        val arr = Array("a", "b", "c")
        for (i <- arr)
          println(i)

        //高级for循环
        //每个生成器都可以带一个条件,注意:if前面没有分号
        for(i <- 1 to 3; j <- 1 to 3 if i != j)
          print((10 * i + j) + " ")
        println()

        //for推导式:如果for循环的循环体以yield开始,则该循环会构建出一个集合

        //每次迭代生成集合中的一个值
        val v = for (i <- 1 to 10) yield i * 10
        println(v)

      }

    }

     

    PS:   _代表当前下的元素
    PS:1 to 10还可以这样写

    1.1. 调用方法和函数

    Scala中的+ - * / %等操作符的作用与Java一样,位操作符 & | ^ >> <<也一样。只是有

    一点特别的:这些操作符实际上是方法。例如:

    a + b

    是如下方法调用的简写:

    a.+(b)

    a 方法 b可以写成 a.方法(b)

    ------------------------------------------------------------------------------

     1.1. 定义方法和函数---是不同的

    1.1.1. 定义方法

     

    PS:对集合进行相应的操作。

     

    /**
     * Created by bee on 2018/3/24.
     */
    object HelloScala {
      //定义一个方法
      //方法m2参数要求是一个函数,函数的参数必须是两个Int类型
      //返回值类型也是Int类型
      def m1(f: (Int, Int) => Int) : Int = {
        f(2, 6)
      }
    
      //定义一个函数f1,参数是两个Int类型,返回值是一个Int类型
      val f1 = (x: Int, y: Int) => x + y
      //再定义一个函数f2
      val f2 = (m: Int, n: Int) => m * n
    
      //main方法
      def main(args: Array[String]) {
    
        //调用m1方法,并传入f1函数
        val r1 = m1(f1)
        println(r1)
    
        //调用m1方法,并传入f2函数
        val r2 = m1(f2)
        println(r2)
      }
    }

     --------------------------------------

    PS:方法是func2,参数是int和double。返回的是元组(Double和Int),里面是函数体。

    -----------------------------------------------------------这里的Unit相当于void

     

    1. 数组、映射、元组、集合

    1.1. 数组

    1.1.1. 定长数组和变长数组

    package cn.itcast.scala

    import scala.collection.mutable.ArrayBuffer

    /**
      * Created by ZX on 2015/11/11.
      */
    object ArrayDemo {

      def main(args: Array[String]) {

        //初始化一个长度为8的定长数组,其所有元素均为0
        val arr1 = new Array[Int](8)
        //直接打印定长数组,内容为数组的hashcode值
        println(arr1)

        //将数组转换成数组缓冲,就可以看到原数组中的内容了
        //toBuffer会将数组转换长数组缓冲
        println(arr1.toBuffer)

        //注意:如果new,相当于调用了数组的apply方法,直接为数组赋值
        //初始化一个长度为1的定长数组
        val arr2 = Array[Int](10)
        println(arr2.toBuffer)

        //定义一个长度为3的定长数组
        val arr3 = Array("hadoop", "storm", "spark")
        //使用()来访问元素
        println(arr3(2))

        //////////////////////////////////////////////////
        //变长数组(数组缓冲)相当于ArrayList
        //如果想使用数组缓冲,需要导入import scala.collection.mutable.ArrayBuffer包
        val ab = ArrayBuffer[Int]()
        //向数组缓冲的尾部追加一个元素
        //+=尾部追加元素
        ab += 1
        //追加多个元素
        ab += (2, 3, 4, 5)
        //追加一个数组++=
        ab ++= Array(6, 7)
        //追加一个数组缓冲
        ab ++= ArrayBuffer(8,9)
        //打印数组缓冲ab

        //在数组某个位置前面插入元素用insert
        ab.insert(0, -1, 0)


        //删除数组某个位置的元素用remove
        ab.remove(8, 2)
        println(ab)

    //删除指定位置的元素,包括该位置


      }
    }

     

    1.1.2. 遍历数组

    1.增强for循环

    2.好用的until会生成脚标,0 until 10 包含0不包含10

     

    package cn.itcast.scala

    /**
      * Created by ZX on 2015/11/12.
      */
    object ForArrayDemo {

      def main(args: Array[String]) {
        //初始化一个数组
        val arr = Array(1,2,3,4,5,6,7,8)
        //增强for循环
        for(i <- arr)
          println(i)

        //好用的until会生成一个Range
        //reverse是将前面生成的Range反转
        for(i <- (0 until arr.length).reverse)
          println(arr(i))
      }
    }

     

    1.1.1. 数组转换

    yield关键字将原始的数组进行转换会产生一个新的数组,原始的数组不变

    package cn.itcast.scala

    /**
      * Created by ZX on 2015/11/12.
      */
    object ArrayYieldDemo {
      def main(args: Array[String]) {
        //定义一个数组
        val arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
        //将偶数取出乘以10后再生成一个新的数组
        val res = for (e <- arr if e % 2 == 0) yield e * 10
        println(res.toBuffer)

        //更高级的写法,用着更爽
        //filter是过滤,接收一个返回值为boolean的函数
        //map相当于将数组中的每一个元素取出来,应用传进去的函数
        val r = arr.filter(_ % 2 == 0).map(_ * 10)
        println(r.toBuffer)

      }
    }

     

    ------------------数组常用算法

    ------------------------------------

     PS:                              元组就是truple

    PS:默认我们生成的序列是不可变的

    package cn.itcast.collect

    object ImmutListDemo {

      def main(args: Array[String]) {
        //创建一个不可变的集合
        val lst1 = List(1,2,3)
        //将0插入到lst1的前面生成一个新的List
        val lst2 = 0 :: lst1
        val lst3 = lst1.::(0)
        val lst4 = 0 +: lst1
        val lst5 = lst1.+:(0)

        //将一个元素添加到lst1的后面产生一个新的集合
        val lst6 = lst1 :+ 3

        val lst0 = List(4,5,6)
        //将2个list合并成一个新的List
        val lst7 = lst1 ++ lst0
        //将lst1插入到lst0前面生成一个新的集合
        val lst8 = lst1 ++: lst0

        //将lst0插入到lst1前面生成一个新的集合
        val lst9 = lst1.:::(lst0)

        println(lst9)
      }
    }

    可变的序列 import scala.collection.mutable._

    package cn.itcast.collect
    import scala.collection.mutable.ListBuffer

    object MutListDemo extends App{
      //构建一个可变列表,初始有3个元素1,2,3
      val lst0 = ListBuffer[Int](1,2,3)
      //创建一个空的可变列表
      val lst1 = new ListBuffer[Int]
      //向lst1中追加元素,注意:没有生成新的集合
      lst1 += 4
      lst1.append(5)

      //将lst1中的元素最近到lst0中, 注意:没有生成新的集合
      lst0 ++= lst1

      //将lst0和lst1合并成一个新的ListBuffer 注意:生成了一个集合
      val lst2= lst0 ++ lst1

      //将元素追加到lst0的后面生成一个新的集合
      val lst3 = lst0 :+ 5
    }

     

     WordCount

    PS:WordCountScala

    val words =Array("hello huan huan","hello bee") //println(arr.sortWith(_>_).toBuffer) val result =words.flatMap(_.split(" ")).map((_,1))// Array((hello,1), (huan,1), (huan,1), (hello,1), (bee,1)) val result1= result.toList.groupBy(_._1)//“_”取每一个元素(hello,1), "._1"去下面的第一个元素 Map(bee -> List((bee,1)), huan -> List((huan,1), (huan,1)), hello -> List((hello,1), (hello,1)))
    //
    val result1= result.toList.groupBy(_._2) 如果是2的话就是这样 ------ Map(1 -> List((hello,1), (huan,1), (huan,1), (hello,1), (bee,1)))
    
        val result4 = result1.map(t=>(t._1,t._2.size))// t代表 huan -> List((huan,1), (huan,1))Map(bee -> 1, huan -> 2, hello -> 2) 
       val result5 = result4.toList.sortBy(_._2).reverse;// 转成List 然后排序 List((huan,3), (hello,2), (bee,1))
    println(result4)// Map(bee -> 1, huan -> 2, hello -> 2)

    ----------------------------------
    PS :
    1. Scala par能够并行计算

     -------------------------------------------------------

    1.1. 

    1.1.1. 类的定义

    //在Scala中,类并不用声明为public。

    //Scala源文件中可以包含多个类,所有这些类都具有公有可见性。
    class Person {
      //用val修饰的变量是只读属性,有getter但没有setter

      //(相当与Java中用final修饰的变量)
      val id = "9527"

      //用var修饰的变量既有getter又有setter
      var age: Int = 18

     

      //类私有字段,只能在类的内部使用
      private var name: String = "唐伯虎"

      //对象私有字段,访问权限更加严格的,Person类的方法只能访问到当前对象的字段
      private[this] val pet = "小强"

    }

    /**
     * Created by bee on 2018/3/25.
     */
    class Person {//这里默认对象为空
    
      val id="9527"   
      var name = "huaan"
      //类私有字段,只能在类的内部使用
    /* val 只有get 方法,*/
    private var name1: String = "唐伯虎" //对象私有字段,访问权限更加严格的,Person类的方法只能访问到当前对象的字段 private[this] val pet = "小强" } //伴生对象 object Person{ def main (args: Array[String]){ val p = new Person println(p.id) println(p.name) println(p.name1)//只是在本类中能用,换个其他的就不行了 // println(p.pet)打印pet会报错 } }

     

    PS:

    1.该类上面第一行是包含构造函数的

    /**
     *每个类都有主构造器,主构造器的参数直接放置类名后面,与类交织在一起
     */
    class Student(val name: String, val age: Int){
      //主构造器会执行类定义中的所有语句
      println("执行主构造器")
    
      try {
        println("读取文件")
       // throw new IOException("io exception")
      } catch {
        case e: NullPointerException => println("打印异常Exception : " + e)
       // case e: IOException => println("打印异常Exception : " + e)
      } finally {
        println("执行finally部分")
      }
    
      private var gender = "male"
    
      //用this关键字定义辅助构造器
      def this(name: String, age: Int, gender: String){
        //每个辅助构造器必须以主构造器或其他的辅助构造器的调用开始
        this(name, age)//在执行之前必须调用这个方法
        println("执行辅助构造器")
        this.gender = gender
      }
    }
    
    object Student{
      def main(args: Array[String]) {
        val s = new Student("bee",15)
      }
    }

     ---------------------------------------------------------------------

    //package cn.itcast.scala
    
    import scala.collection.mutable.ArrayBuffer
    
    /**
     * Created by ZX on 2015/11/14.
     */
    object SingletonDemo {
      def main(args: Array[String]) {
        //单例对象,不需要new,用【类名.方法】调用对象中的方法
        val session = SessionFactory.getSession()
        println(session)
      }
    }
    
    object SessionFactory{
      //该部分相当于java中的静态块
      var counts = 5
      val sessions = new ArrayBuffer[Session]()
      while(counts > 0){
        sessions += new Session
        counts -= 1
      }
    
      //在object中的方法相当于java中的静态方法
      def getSession(): Session ={
        sessions.remove(0)
      }
    }
    
    class Session{
    
    }

    package cn.itcast.scala
    
    /**
      * Created by ZX on 2015/11/14.
      */
    class Dog {
      val id = 1
      private var name = "itcast"
    
      def printName(): Unit ={
        //在Dog类中可以访问伴生对象Dog的私有属性
        println(Dog.CONSTANT + name )
      }
    }
    
    /**
      * 伴生对象
      */
    object Dog {
    
      //伴生对象中的私有属性
      private val CONSTANT = "汪汪汪 : "
    
      def main(args: Array[String]) {
        val p = new Dog
        //访问私有的字段name
        p.name = "123"
        p.printName()
      }
    }

    /**
     * Created by bee on 2018/3/26.
     */
    class ApplyDemo {
    
      val name = "dong"
    
    }
    
    object ApplyDemo{
    
      def apply(name:String):Unit={
         println(name)
         println("123")
      }
    
      def apply():ApplyDemo={
         println("456")
         new ApplyDemo
      }
    
      def main(args: Array[String]) {
         val a1 = ApplyDemo("xxx")
         println(a1)//返回为()空
         val a2 = ApplyDemo()
         println(a2)
        //********************上面调用apply方法
         val a3 = new ApplyDemo
         println(a3)
      }
    }

     

    1.1. 继承

    1.1.1. 扩展类

    Scala中扩展类的方式和Java一样都是使用extends关键字

    1.1.2. 重写方法

    Scala中重写一个非抽象的方法必须使用override修饰符

    1.1.3. 类型检查和转换

    Scala

    Java

    obj.isInstanceOf[C]

    obj instanceof C

    obj.asInstanceOf[C]

    (C)obj

    classOf[C]

    C.class

    1.1.4. 超类的构造

    package cn.itcast.scala

    /**
      * Created by ZX on 2015/11/10.
      */
    object ClazzDemo {
      def main(args: Array[String]) {
        //val h = new Human
        //println(h.fight)
      }
    }

    trait Flyable{
      def fly(): Unit ={
        println("I can fly")
      }

      def fight(): String
    }

    abstract class Animal {
      def run(): Int
      val name: String
    }

    class Human extends Animal with Flyable{

      val name = "abc"

      //打印几次"ABC"?
      val t1,t2,(a, b, c) = {
        println("ABC")
        (1,2,3)
      }

      println(a)
      println(t1._1)

      //在Scala中重写一个非抽象方法必须用override修饰
      override def fight(): String = {
        "fight with 棒子"
      }
      //在子类中重写超类的抽象方法时,不需要使用override关键字,写了也可以
      def run(): Int = {
        1
      }
    }

     

    /**
     * Created by bee on 2018/3/26.
     */
    trait Animal {  //类似于接口
    
      def run(): Unit ={
        println("animal run")
      }
      def eat(): Unit ={
        println("animal eat")
      }
    }
    /**
     * Created by bee on 2018/3/26.
     */
    abstract class Human {
    
    }
    /**
     * Created by bee on 2018/3/26.
     */
    class Chinese extends Human with Animal{   //继承人类,实现接口
    
       override def eat(): Unit ={
         println("chinese eat")
       }
    
    }
    
    object Chinese{
      def main(args: Array[String]) {
        var c = new Chinese
        c.eat()
        c.run()
      }
    }
    PS:和java基本上一致

     

    1.1. 匹配字符串

    package cn.itcast.cases
    import scala.util.Random
    
    object CaseDemo01 extends App{
      val arr = Array("YoshizawaAkiho", "YuiHatano", "AoiSola")
      val name = arr(Random.nextInt(arr.length))
      name match {
        case "YoshizawaAkiho" => println("吉泽老师...")
        case "YuiHatano" => println("波多老师...")
        case _ => println("真不知道你们在说什么...")
      }
    }

    1.1. 匹配数据类型

    package cn.itcast.cases
    import scala.util.Random
    
    class CaseDemo{
    
    }
    object CaseDemo01 extends App{
      //val v = if(x >= 5) 1 else if(x < 2) 2.0 else "hello"
      val arr = Array("hello", 1, 2.0, new CaseDemo)
      val v = arr(Random.nextInt(4))
      println(v)
      v match {
        case x: Int => println("Int " + x)
        case y: Double if(y >= 0) => println("Double "+ y)
        case z: String => println("String " + z)
        case _ => throw new Exception("not match exception")
      }
    }

    1.1. 匹配数组、元组

    package cn.itcast.cases
    
    object CaseDemo01 extends App{
      //数组匹配
      val arr = Array(1, 3, 5)
      arr match {
        case Array(1, x, y) => println(x + " " + y)
        case Array(0) => println("only 0")
        case Array(0, _*) => println("0 ...")
        case _ => println("something else")
      }
      //列表匹配
      val lst = List(3, -1)
      lst match {
        case 0 :: Nil => println("only 0")
        case x :: y :: Nil => println(s"x: $x y: $y")
        case 0 :: tail => println("0 ...")
        case _ => println("something else")
      }
      //元组匹配
      val tup = (2, 3, 7)
      tup match {
        case (1, x, y) => println(s"1, $x , $y")
        case (_, z, 5) => println(z)
        case  _ => println("else")
      }
    }

    package cn.itcast.cases
    import scala.util.Random
    
    case class SubmitTask(id: String, name: String)
    case class HeartBeat(time: Long)
    case object CheckTimeOutTask
    
    object CaseDemo01 extends App{
      val arr = Array(CheckTimeOutTask, HeartBeat(12333), SubmitTask("0001", "task-0001"))
    
      arr(Random.nextInt(arr.length)) match {
        case SubmitTask(id, name) => {
          println(s"$id, $name")//前面需要加上s, $id直接取id的值
        }
        case HeartBeat(time) => {
          println(time)
        }
        case CheckTimeOutTask => {
          println("check")
        }
      }
    }

     

    PS:存在就是Some 不存在就是None
    
    object CaseDemo01 {
      def main(args: Array[String]) {
        val map = Map("a" -> 1, "b" -> 2)
        val v = map.get("b") match {
          case Some(i) => i
          case None => 0
        }
        println(v)
        //更好的方式
        val v1 = map.getOrElse("c", 0)
        println(v1)
      }
    }

    package cn.itcast.cases
    
    object CaseDemo01  {
    
      def func1: PartialFunction[String, Int] = {//第一个参数是输入,第二个参数是输出
        case "one" => 1
        case "two" => 2
        case _ => -1
      }
    
      def func2(num: String) : Int = num match {
        case "one" => 1
        case "two" => 2
        case _ => -1
      }
    
      def main(args: Array[String]) {
        println(func1("one"))
        println(func2("one"))
      }
    }
    输出:1 1

    PS:
    akka的实现是在scala的基础之上的

    //package cn.itcast.actor
    //注意导包是scala.actors.Actor
    import scala.actors.Actor
    
    object MyActor1 extends Actor{
      //重新act方法
      def act(){
        for(i <- 1 to 10){
          println("actor-1 " + i)
          Thread.sleep(2000)
        }
      }
    }
    
    object MyActor2 extends Actor{
      //重新act方法
      def act(){
        for(i <- 1 to 10){
          println("actor-2 " + i)
          Thread.sleep(2000)
        }
      }
    }
    
    object CaseDemo01 extends App{
      //启动Actor
      MyActor1.start()
      MyActor2.start()
    }

    import scala.actors.Actor
    
    /**
     * Created by ZX on 2016/4/4.
     */
    class MyActor extends Actor {
    
      override def act(): Unit = {
        while (true) {
          receive {//receive这里是一个偏函数
            case "start" => {
              println("starting ...")
              Thread.sleep(5000)
              println("started")
            }
            case "stop" => {
              println("stopping ...")
              Thread.sleep(5000)
              println("stopped ...")
            }
          }
        }
      }
    }
    
    object CaseDemo01 {
      def main(args: Array[String]) {
        val actor = new MyActor
        actor.start()
        actor ! "start"  //异步传输
        actor ! "stop"
        println("消息发送完成!")
      }
    }

    import scala.actors.Actor
    
    /**
      * Created by ZX on 2016/4/4.
      */
    class YourActor extends Actor {
    
      override def act(): Unit = {
        loop {
          react {
            case "start" => {
              println("starting ...")
              Thread.sleep(5000)
              println("started")
            }
            case "stop" => {
              println("stopping ...")
              Thread.sleep(8000)
              println("stopped ...")
            }
          }
        }
      }
    }
    
    
    object YourActor {
      def main(args: Array[String]) {
        val actor = new YourActor
        actor.start()
        actor ! "start"
        actor ! "stop"
        println("消息发送完成!")
      }
    }
     

     1.1. 第四个例子(结合case class发送消息)

    import scala.actors.Actor
    
    class AppleActor extends Actor {
    
      def act(): Unit = {
        while (true) {
          receive {
            case "start" => println("starting ...")
            case SyncMsg(id, msg) => {
              println(id + ",sync " + msg)
              Thread.sleep(5000)
              sender ! ReplyMsg(3,"finished")
            }
            case AsyncMsg(id, msg) => {
              println(id + ",async " + msg)
              Thread.sleep(5000)
            }
          }
        }
      }
    }
    
    object AppleActor {
      def main(args: Array[String]) {
        val a = new AppleActor
        a.start()
        //异步消息
        a ! AsyncMsg(1, "hello actor")
        println("异步消息发送完成")
        //同步消息
        //val content = a.!?(1000, SyncMsg(2, "hello actor"))
        //println(content)
        val reply = a !! SyncMsg(2, "hello actor")
        println(reply.isSet)
        //println("123")
        val c = reply.apply()
        println(reply.isSet)
        println(c)
      }
    }
    case class SyncMsg(id : Int, msg: String)
    case class AsyncMsg(id : Int, msg: String)
    case class ReplyMsg(id : Int, msg: String)

     PS:WordCount

    有两个文件,多线程读取处理

    import java.io.File
    
    import scala.actors.{Actor, Future}
    import scala.collection.mutable
    import scala.io.Source
    
    /**
     * Created by ZX on 2016/4/4.
     */
    class Task extends Actor {
    
      override def act(): Unit = {
        loop {
          react {
            case SubmitTask(fileName) => {
              val lines = Source.fromFile(new File(fileName)).getLines().toList
              val result = lines.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).mapValues(_.length)
              //val result = lines.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).mapValues(_.foldLeft(0)(_ + _._2))
              sender ! ResultTask(result) //把结果发给发送者
            }
            case StopTask => {//就是一个信号,所有没有参数
              exit()
            }
          }
        }
      }
    }
    
    object WorkCount {
      def main(args: Array[String]) {
        val files = Array("d://word.txt", "d://word.log")
    
        val replaySet = new mutable.HashSet[Future[Any]]
        val resultList = new mutable.ListBuffer[ResultTask]
    
        for(f <- files) {
          val t = new Task
          val replay = t.start() !! SubmitTask(f)  //同步发送,返回一个reply回复
          replaySet += replay
        }
    
        while(replaySet.size > 0){
          val toCumpute = replaySet.filter(_.isSet)  //是否能够执行计算
          for(r <- toCumpute){
            val result = r.apply()
            resultList += result.asInstanceOf[ResultTask]
            replaySet.remove(r)
          }
          Thread.sleep(100)
        }
        //list里面装了很多的map
        val finalResult = resultList.map(_.result).flatten.groupBy(_._1).mapValues(x => x.foldLeft(0)(_ + _._2))
        println(finalResult)
        //Map(qq -> 1, bjj -> 1, 123 -> 1, xxx -> 1, hanhan -> 1, xyz -> 1, helo -> 2, bee -> 1, zz -> 1, wzq -> 1, tyou -> 1, hello -> 10, bb -> 1, thank -> 1)
    
      }
    }
    
    case class SubmitTask(fileName: String)
    case object StopTask
    case class ResultTask(result: Map[String, Int])

     

    object FunDemo {
      def main(args: Array[String]) {
        def f2(x: Int) = x * 2
        val f3 = (x: Int) => x * 3
        val f4: (Int) => Int = { x => x * 4 }
        val f4a: (Int) => Int = _ * 4
        val f5 = (_: Int) * 5
        val list = List(1, 2, 3, 4, 5)
        var new_list: List[Int] = null
        //第一种:最直观的方式 (Int) => Int
        //new_list = list.map((x: Int) => x * 3)
    
        //第二种:由于map方法知道你会传入一个类型为(Int) => Int的函数,你可以简写
        //new_list = list.map((x) => x * 3)
    
        //第三种:对于只有一个参数的函数,你可以省去参数外围的()
        //new_list = list.map(x => x * 3)
    
        //第四种:(终极方式)如果参数在=>右侧只出现一次,可以使用_
        new_list = list.map(_ * 3)
    
        new_list.foreach(println(_))
    
        var a = Array(1,2,3)
        a.map(_* 3)
      }
    }

     

    package cn.itcast.impli
    
    import java.io.File
    import scala.io.Source
    
    
    //隐式的增强File类的方法
    class RichFile(val from: File) {
      def read = Source.fromFile(from.getPath).mkString
    }
    
    object RichFile {
      //隐式转换方法
      implicit def file2RichFile(from: File) = new RichFile(from)
    
    }
    
    object MainApp{
      def main(args: Array[String]): Unit = {
        //导入隐式转换
        import RichFile._
        //import RichFile.file2RichFile
        println(new File("c://words.txt").read)
    
      }
    }
    
    
    
    package cn.itcast.scala
    
    import java.awt.GridLayout
    
    /**
      * Created by ZX on 2015/11/13.
      */
    object ImplicitContext{
      //implicit def girl2Ordered(g : Girl) = new Ordered[Girl]{
      //  override def compare(that: Girl): Int = if (g.faceValue > that.faceValue) 1 else -1
      //}
    
      implicit object OrderingGirl extends Ordering[Girl]{
        override def compare(x: Girl, y: Girl): Int = if (x.faceValue > y.faceValue) 1 else -1
      }
    }
    
    class Girl(var name: String, var faceValue: Double){
      override def toString: String = s"name : $name, faveValue : $faceValue"
    }
    
    //class MissRight[T <% Ordered[T]](f: T, s: T){
    //  def choose() = if(f > s) f else s
    //}
    //class MissRight[T](f: T, s: T){
    //  def choose()(implicit ord: T => Ordered[T]) = if (f > s) f else s
    //}
    
    class MissRight[T: Ordering](val f: T, val s: T){
      def choose()(implicit ord: Ordering[T]) = if(ord.gt(f, s)) f else s
    }
    
    object MissRight {
      def main(args: Array[String]) {
        import ImplicitContext.OrderingGirl
        val g1 = new Girl("yuihatano", 99)
        val g2 = new Girl("jzmb", 98)
        val mr = new MissRight(g1, g2)
        val result = mr.choose()
        println(result)
      }
    }
  • 相关阅读:
    MYSQL视图的学习笔记
    MYSQL常用操作函数的封装
    table表格边框样式
    用于防SQL注入的几个函数
    Html中版权符号的字体选择问题(如何让版权符号更美观)
    拿出“请勿打扰”的态度来
    editplus批量删除html代码空行
    解决&nbsp在IE与firefox宽度不一致的问题
    解决IE6下DIV无法实现1px高度问题
    处理落后员工
  • 原文地址:https://www.cnblogs.com/bee-home/p/8626376.html
Copyright © 2011-2022 走看看