大数据系列修炼-Scala课程10

今天主要是关于Scala中对List的相关操作,list在Scala中应该是至关重要,接下来会讲解关于List的一系列操作

List的map、flatMap、foreach、filter操作讲解

  1.关于List的Map、flatMap操作、区别

  2.对List的foreach、filter操作

    //list中的Map中用一个函数表达式-->实则是对list进行操作,_可以表示一个函数或者表达式
        List(1, 2, 3, 4, 6) map (_ + 1)   //> res0: List[Int] = List(2, 3, 4, 5, 7)
    val data = List("Scala", "Hadoop", "Spark")   //> data  : List[String] = List(Scala, Hadoop, Spark)
    //计算List中元素的长度
    data map (_.length)                           //> res1: List[Int] = List(5, 6, 5)
    //把Lis元素转换为list并t倒置后又组成list输出
    data map (_.toList.reverse.mkString)          //> res2: List[String] = List(alacS, poodaH, krapS)
    //把list中元素转换为list
    data.map(_.toList)                            //> res3: List[List[Char]] = List(List(S, c, a, l, a), List(H, a, d, o, o, p), L
    //flatMap把list元素转换为list后,再连接成新的list输出         //| ist(S, p, a, r, k))

    data.flatMap(_.toList)                        //> res4: List[Char] = List(S, c, a, l, a, H, a, d, o, o, p, S, p, a, r, k)
    //range是左臂右开的,[1,10) -->flatMap组成元素
    List.range(1, 10) flatMap (i => List.range(1, i) map (j => (i, j)))
                                                  //> res5: List[(Int, Int)] = List((2,1), (3,1), (3,2), (4,1), (4,2), (4,3), (5,1
                                                  //| ), (5,2), (5,3), (5,4), (6,1), (6,2), (6,3), (6,4), (6,5), (7,1), (7,2), (7,
                                                  //| 3), (7,4), (7,5), (7,6), (8,1), (8,2), (8,3), (8,4), (8,5), (8,6), (8,7), (9
                                                  //| ,1), (9,2), (9,3), (9,4), (9,5), (9,6), (9,7), (9,8))

    var sum = 0                                   //> sum  : Int = 0
    List(1, 2, 3, 4, 5) foreach (sum += _)
    println("sum : " + sum)                       //> sum : 15
    //filter过滤
    println(List(1, 2, 3, 4, 6, 7, 8, 9, 10) filter (_ % 2 ==0))
                                                  //> List(2, 4, 6, 8, 10)
    println(data filter (_.length == 5))          //> List(Scala, Spark)

List的partition、find、takeWhile、dropWhile、span、forall、exsists操作实现

  1.关于Scala中List的partition、find、takeWhile、dropWhile实现

  2.关于Scala中的span。forall、exsists实例讲解

 //partition按照表达式进行拆分为两个list
    println(List(1, 2, 3, 4, 5) partition (_ % 2 ==0))
                                                  //> (List(2, 4),List(1, 3, 5))
     //find查找list中符合表达式的元素有几个
    println(List(1, 2, 3, 4, 5) find (_ % 2 ==0)) //> Some(2)
    println(List(1, 2, 3, 4, 5) find (_  <=0))    //> None
    //takeWhile表示list满足表示式组成list
    println(List(1, 2, 3, 4, 5) takeWhile (_  < 4))
                                                  //> List(1, 2, 3)
      //dropWhile表示list中满足表达式形成新的list与其相反
    println(List(1, 2, 3, 4, 5) dropWhile (_  < 4))
                                                  //> List(4, 5)
     //span是上面两者的组合
    println(List(1, 2, 3, 4, 5) span (_  < 4))    //> (List(1, 2, 3),List(4, 5))
    //exists表示组成元素是否存在该表达式的元素-->如果有则返回true否则返回false
    def hastotallyZeroRow(m: List[List[Int]]) = m exists (row => row forall (_ == 0))
                                                  //> hastotallyZeroRow: (m: List[List[Int]])Boolean
    val m= List(List(1,0,0), List(0,1,0), List(0,0,1))
                                                  //> m  : List[List[Int]] = List(List(1, 0, 0), List(0, 1, 0), List(0, 0, 1))
    println(hastotallyZeroRow(m))                 //> false

List的foldLeft、foldRight、sortWith操作实现

  1.foldLeft、foldRight实例讲解

  //foldLeft源码中可以看出定义了两个函数进行求和计算 def /:[B](z: B)(op: (B, A) => B): B = foldLeft(z)(op)

  def :\[B](z: B)(op: (A, B) => B): B = foldRight(z)(op)

  def foldLeft[B](z: B)(op: (B, A) => B): B = {
    var result = z
    this foreach (x => result = op(result, x))
    result
  }

  2.sortWith实例讲解

      //两个等价 从零开始相加
    println((1 to 100).foldLeft(0)(_+_) )         //> 5050
    println((0 /: (1 to 100))(_+_))               //> 5050
    //从1到5进行相减
    println((1 to 5).foldRight(100)(_-_))         //> -97
    println(((1 to 5):\100)(_-_))                 //> -97

    //对list进行排序
    println(List(1, -3, 4, 2, 6) sortWith (_ < _))//> List(-3, 1, 2, 4, 6)

List伴生对象操作方法实现讲解

  1.关于List的apply、make、range实例讲解

  2.unzip、flatten、contact、map2实例讲解

  //List.apply()=List()
    println(List(1, 2, 3))                        //> List(1, 2, 3)
    //List.make复制同样的元素
   // List.make(3, 5)
   //range 左闭右开
    println(List.range(1, 5))                     //> List(1, 2, 3, 4)
    //计算间距为-3的元素
    println(List.range(9, 1, -3))                 //> List(9, 6, 3)
    //abcde转换为list后进行组合
    val zipped = "abcde".toList zip List(1, 2, 3, 4, 5)
                                                  //> zipped  : List[(Char, Int)] = List((a,1), (b,2), (c,3), (d,4), (e,5))
    println(zipped)                               //> List((a,1), (b,2), (c,3), (d,4), (e,5))
    //把zipped转换为反向的
    println(zipped.unzip)                         //> (List(a, b, c, d, e),List(1, 2, 3, 4, 5))
    //fatter把list中的list转换为一个list
    println(List(List(‘a‘, ‘b‘), List(‘c‘), List(‘d‘, ‘e‘)).flatten)
     //把list组合转换为list                             //> List(a, b, c, d, e)
    println(List.concat(List(), List(‘b‘), List(‘c‘)))
                                                  //> List(b, c)
         //map2两个list按照最后一个表达式进行计算
    //println(List.map2(List(10, 20), List(10, 10)) (_ * _))

该内容都是从王家林老师教程中学习,他的微信号:18610086859

最新课程视频76讲:http://yun.baidu.com/s/1qWkPspm

该文章的地址35-38讲:http://pan.baidu.com/s/1qWxaAeC

时间: 2024-10-27 02:05:07

大数据系列修炼-Scala课程10的相关文章

大数据系列修炼-Scala课程06

关于Scala中的正则表达式与模式匹配结合的正则表达式Reg 正则表达式的实现:正则表达式的定义与其它语言差不多,只需在表达式后加一个.r,并且可以遍历相应的表达式进行匹配 //定义的正则表达式 val regex="""([0-9]+) ([a-z]+)""".r //由数字与字母组成的常量 val numPattern = "[0-9]+".r //由数字组成的常量 val numberPattern = "&q

大数据系列修炼-Scala课程03

前言 今天上班看了很多关于前端js,jQuery.bootstrap.js以及springMVC看得迷迷糊糊的,毕竟以前很少去学习前端的技术,所有看得有点困,还好看得比较多,回家后也开始学习关于Scala相关的课程,实验一下每天坚持做大数据相关的事情,一年后会成为什么样子......期待中....,今天也接着昨天的课程继续. Scala内部类实战详解 Scala内部类详解:scala中内部类要访问外部类直接把外部类的对象给内部类了,让其自己访问,内部类也需要实例化,这和java中有很多的区别,内

大数据系列修炼-Scala课程07

由于昨天下班后有点困,就没有来及写博客,今天会把它补上!把这个习惯坚持下去! 关于Scala高阶函数详解 1.Scala高阶函数代码实现:高阶函数就是在我们函数中套用函数 2.高阶函数代码详解:高阶函数能够让方法的调用更加便捷 println("Welcome to the Scala worksheet") //> Welcome to the Scala worksheet //(1 to 9)数组中的map方法向数组中放* 用foreach用于来循环 println _ 表

大数据系列修炼-Scala课程04

Scala中继承实现:超类的构造.字段重写.方法重写 关于超类的构建:超类可以在子类没有位置的限制,可以在子类中调用父类的方法 类中字段重写:在重写字段前面加一个override就可以重新赋值 类中方法重写:与字段重写差不多,参数,方法名也要相同 class Person1(val name : String, var age : Int){ println("The primary constructor of Person") val school = "BJU"

大数据系列修炼-Scala课程02

Scala数组操作实战详解 接着昨天的课程,下面我们继续学习关于Scala数组操作详解.Scala数组的定义 //数组定义 //定长数组格式 /** * val arrayName = new Array[datatype](length) * val arrayName = Array(constant1,constant2,....) */ //不定长数组定义格式 /* * var arrayBufferName =ArrayBuffer[datatype]() */ 数组的基本操作:包括截

大数据系列修炼-Scala课程08

接下来会讲解关于各种模式匹配,从中就会知道模式匹配的重要性 关于Type.Array.List.Tuple模式解析 1.Type模式匹配代码解析 //关于Type类型的模式匹配 //匹配 Int类型.string类型.Map类型[_,_]代表任意类型的k,v def match_type(t : Any) = t match { case p : Int => println("It is Integer") case p : String => println("

大数据系列修炼-Scala课程05

Scala多重继承.构造器的执行顺序.AOP实现 多重继承的trait实现:Scala中接口可以继承具体的类,trait接口可以实现多重继承,并且某个类也可以继承特定的类,在继承后面可以混入,接口的实现 多重继承构造器执行顺序:多重继承构造器执行顺序是从左到右按次序执行,如果前面类以及被继承实现了,后面的类就没有必要去实现,父类只需执行一次 object triatScala { def main(args: Array[String]): Unit = { val t1 = new Piano

大数据系列修炼-Scala课程11

接着昨天的list,也是学习集合的相关知识 ListBuffer.ArrayBuffer.Queue.stack相关操作 1.ListBuffer.ArrayBuffer代码实现:ListBuffer与ArrayBuffer都是mutable可变的与java中的定义也差不多,可以追加的. 2.Queue.Stack相关操作:队列是一端进去一端出来,而stack也是后进先出的原则,他们都是mutable可变的 import scala.collection.mutable.ListBuffer v

好程序员大数据教程分享Scala系列之Option_偏函数_String

好程序员大数据教程分享Scala系列之Option_偏函数_StringOption类型在Scala中Option类型样例类用来表示可能存在或也可能不存在的值(Option的子类有Some和None).Some包装了某个值,None表示没有值. object OptionDemo {def main(args: Array[String]) {val map = Map("a" -> 1, "b" -> 2)val v = map.get("b