大数据之scala基本语法学习

package edu.snnu.test

object list2 {
    //把字符串转化成一个char类型的list
     "99 Red Balloons".toList                  //> res0: List[Char] = List(9, 9,  , R, e, d,  , B, a, l, l, o, o, n, s)
     
     "99 Red Balloons".toList.filter(x => Character.isDigit(x))
                                                  //> res1: List[Char] = List(9, 9)
                                                  
    "99 Red Balloons".toList.takeWhile(x => x != 'B')
                                                  //> res2: List[Char] = List(9, 9,  , R, e, d,  )
 
     val c = List("x", "y", "z")               //> c  : List[String] = List(x, y, z)
     c.map(x => x.toUpperCase)                 //> res3: List[String] = List(X, Y, Z)
     
     //上面的语句可以简写为下面形式,因为scala中有下划线作为通配符
     c.map(_.toUpperCase())                    //> res4: List[String] = List(X, Y, Z)
 
     val a = List(1, 2, 3, 4)                  //> a  : List[Int] = List(1, 2, 3, 4)
     a.filter(_%2 == 1)                        //> res5: List[Int] = List(1, 3)
     
     //对a这个list中的每个奇数元素加上10
    a.filter(_%2 == 1).map(_+10)              //> res6: List[Int] = List(11, 13)
     
     val q = List(a, List(4, 5, 6))            //> q  : List[List[Int]] = List(List(1, 2, 3, 4), List(4, 5, 6))
     q.map(x => x.filter(_%2 == 0))            //> res7: List[List[Int]] = List(List(2, 4), List(4, 6))
     q.map(_.filter(_%2 == 0))                 //> res8: List[List[Int]] = List(List(2, 4), List(4, 6))
     
     //把有两个集合的集合中,内层中满足条件的元素变到一个list中
     q.flatMap {_.filter(_%2 == 0)}            //> res9: List[Int] = List(2, 4, 4, 6)
     
     
    
}

柯里化案例:

(x: Int, y : Int) => x + y                      //> res0: (Int, Int) => Int = <function2>
  
  //def curriedAdd(a: Int)(b:Int)(c:Int)(d:Int) = a + b*c*d
  def curriedAdd(a:Int,b:Int)(c:Int)(d:Int) = a + b*c*d
                                                  //> curriedAdd: (a: Int, b: Int)(c: Int)(d: Int)Int
  //curriedAdd(2)(2)(2)(2)
    
    val addOne = curriedAdd(4,3)_             //> addOne  : Int => (Int => Int) = <function1>
    
    val c = addOne(2)(3)                      //> c  : Int = 22
    println(addOne)                           //> <function1>

Map使用方法

package edu.snnu.test

object mapDemo {
  println("Welcome to the Scala worksheet")       //> Welcome to the Scala worksheet

    val p = Map(1 -> "David", 9 -> "Elwood", "rain" -> "明明")
                                                  //> p  : scala.collection.immutable.Map[Any,String] = Map(1 -> David, 9 -> Elwoo
                                                  //| d, rain -> 鏄庢槑)
    //通过key取map中对应的val
    p(1)                                      //> res0: String = David
    p(9)                                      //> res1: String = Elwood
    p("rain")                                 //> res2: String = 鏄庢槑
    
    //contains方法用来判断某个key在不在map里面
    p.contains(1)                             //> res3: Boolean = true
    
    p.contains(2)                             //> res4: Boolean = false
    
    //调用map变量的keys方法将会返回一个存储这个map所有key的list
    p.keys                                    //> res5: Iterable[Any] = Set(1, 9, rain)
    //val叶同样
    p.values                                  //> res6: Iterable[String] = MapLike(David, Elwood, 鏄庢槑)
    
    //添加一个(key,value)到map中
    val pp = p+(8->"Archer")                  //> pp  : scala.collection.immutable.Map[Any,String] = Map(1 -> David, 9 -> Elwo
                                                  //| od, rain -> 鏄庢槑, 8 -> Archer)
    p                                         //> res7: scala.collection.immutable.Map[Any,String] = Map(1 -> David, 9 -> Elwo
                                                  //| od, rain -> 鏄庢槑)
    
    pp                                        //> res8: scala.collection.immutable.Map[Any,String] = Map(1 -> David, 9 -> Elwo
                                                  //| od, rain -> 鏄庢槑, 8 -> Archer)
                                                  
     //删除一个(key, value):map变量减去要删除的键值对的key即可
     p-1                                       //> res9: scala.collection.immutable.Map[Any,String] = Map(9 -> Elwood, rain -> 
                                                  //| 鏄庢槑)
     p ++ List(2 ->"Alice", 5->"Bob")          //> res10: scala.collection.immutable.Map[Any,String] = Map(5 -> Bob, 1 -> David
                                                  //| , 9 -> Elwood, rain -> 鏄庢槑, 2 -> Alice)
                                                  
  p -- List(1, 9, 2, "rain")                      //> res11: scala.collection.immutable.Map[Any,String] = Map()
  
  p                                               //> res12: scala.collection.immutable.Map[Any,String] = Map(1 -> David, 9 -> Elw
                                                  //| ood, rain -> 鏄庢槑)
    p ++ List(2 ->"Alice", 5->"Bob") -- List(9, 1, "rain")
                                                  //> res13: scala.collection.immutable.Map[Any,String] = Map(5 -> Bob, 2 -> Alice
                                                  //| )
  
}

快速排序小案例

package edu.snnu.test

object qSort {
  println("Welcome to the Scala worksheet")       //> Welcome to the Scala worksheet
  
  def qSort(a:List[Int]):List[Int] = {
      if(a.length < 2) a
      else
          qSort(a.filter(_<a.head)) ++
          a.filter(_ == a.head) ++
          qSort(a.filter(_>a.head))
  }                                               //> qSort: (a: List[Int])List[Int]
  
  val l = List(1, 2, 3, 4, 5, 9, 8, 7, 6)         //> l  : List[Int] = List(1, 2, 3, 4, 5, 9, 8, 7, 6)
  qSort(List(4, 3, 2, 6, 7, 8, 9))                //> res0: List[Int] = List(2, 3, 4, 6, 7, 8, 9)
  qSort(l)                                        //> res1: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
  
  
}

range的使用

package edu.snnu.test

object Range {
  println("Welcome to the Scala worksheet")       //> Welcome to the Scala worksheet
  
  1 to 10                                         //> res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7,
                                                  //|  8, 9, 10)
  1 to 10 by 2                                    //> res1: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9)
  

    (1 to 10).toList                          //> res2: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    
    1 until 10                                //> res3: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
    
    //也就是说to上届是一个闭区间 ,until上界是一个闭区间
    val s = 1     #::2 #:: 3 #::Stream.empty
                                                  //> s  : <error> = Stream(1, ?)
}

reduceLeft以及foldleft规约的使用

package edu.snnu.test

object reduceLeft {
    //reduceLeft是一种规约方法
  val a = List(1, 2, 3, 4)                        //> a  : List[Int] = List(1, 2, 3, 4)
     //map的返回值和原来的值的类型是一样的,flatMap会把两层的map转化为一层的map
     a.reduceLeft((x, y) => x + y)             //> res0: Int = 10
    //简写方式,用两个下划线来代替这两个参数
    a.reduce(_+_)                             //> res1: Int = 10
    
    //foldleft也是一种规约方法
    a.foldLeft(1)(_+_)                        //> res2: Int = 11
    a.foldLeft(2)(_*_)                        //> res3: Int = 48
}

懒加载

package edu.snnu.test


object StreamDemo {
  println("Welcome to the Scala worksheet")       //> Welcome to the Scala worksheet
  
  //懒加载,在用的时候求值,按需求值
  //val a = 1 #:: 2 #:: 3 #:: Stream.empty
  
  //val stream = (1 to 10000000).toStream()
  
}

List的使用

package edu.snnu.test

object test1 {
  println("Welcome to the Scala worksheet")       //> Welcome to the Scala worksheet
  
  
  val a = List(1, 2, 3, 4)                        //> a  : List[Int] = List(1, 2, 3, 4)
  
  //把0添加到刚才的list里面,两个冒号为连接操作符,连接操作符的左边是成员,右边是一个list
  val b = 0::a                                    //> b  : List[Int] = List(0, 1, 2, 3, 4)
  
  val c = "x"::"y"::"z"::Nil                      //> c  : List[String] = List(x, y, z)
  
  //生成一个list(z)
  "z"::Nil                                        //> res0: List[String] = List(z)
  
  //三个毛冒号的连接操作符用于连接两个list
  a:::c                                           //> res1: List[Any] = List(1, 2, 3, 4, x, y, z)
  
  //list的head方法返回当前list的第一个元素
  a.head                                          //> res2: Int = 1
  b.head                                          //> res3: Int = 0
  c.head                                          //> res4: String = x
  
  //list的tail方法返回当前list里除了第一个元素外的所有元素组成的list,这样的列表我们称为尾列表
  a                                               //> res5: List[Int] = List(1, 2, 3, 4)
  a.tail                                          //> res6: List[Int] = List(2, 3, 4)
  b                                               //> res7: List[Int] = List(0, 1, 2, 3, 4)
  b.tail                                          //> res8: List[Int] = List(1, 2, 3, 4)
  
  a.isEmpty                                       //> res9: Boolean = false
  
     Nil                                       //> res10: scala.collection.immutable.Nil.type = List()
     Nil.isEmpty                               //> res11: Boolean = true
     
     def walkthru(l:List[Int]) :String = {
         if(l.isEmpty) ""
         else {
             println(l.tail)
             l.head.toString+""+walkthru(l.tail)
             
         }
     }                                         //> walkthru: (l: List[Int])String
  
     walkthru(List(1,2,3,4,5))                 //> List(2, 3, 4, 5)
                                                  //| List(3, 4, 5)
                                                  //| List(4, 5)
                                                  //| List(5)
                                                  //| List()
                                                  //| res12: String = 12345
  
  //对list a进行过滤,如果里面的元素x满足x%2 == 1,那么保留下来,否则就删除
  a.filter(x => x%2 == 1)                         //> res13: List[Int] = List(1, 3)
}

tuple的使用

package edu.snnu.test

object tuple {
  
  1 -> 2                                          //> res0: (Int, Int) = (1,2)
  
  //定义一个tuple
  val t = (1, "Alice", "Math", 95,5)              //> t  : (Int, String, String, Int, Int) = (1,Alice,Math,95,5)
   
  //获得tuple t的第一个成员
  t._1                                            //> res1: Int = 1
     //获得tuple t的第二个成员
     t._2                                      //> res2: String = Alice
     //第三个
     t._3                                      //> res3: String = Math
     
     //函数的返回值一般都只有一个值,如果有多个值的话我们就可以把这多个值封装在一个tuple里,
     
     val a = List(1, 2, 3, 4)                  //> a  : List[Int] = List(1, 2, 3, 4)
     
     //(Int, Int, Int)代表返回值是一个三个int数据的list
     def sumSq(in: List[Int]):(Int,Int,Int) = {
         //下面t代表(0, 0, 0)这个元组,v代表这个list中的每一个值
         in.foldLeft((0,0,0))((t,v) => (t._1 + 1, t._2+v, t._3+v*v))
     }                                         //> sumSq: (in: List[Int])(Int, Int, Int)
     
     sumSq(a)                                  //> res4: (Int, Int, Int) = (4,10,30)
     
}
原文地址:https://www.cnblogs.com/rain-1/p/5804740.html