zoukankan      html  css  js  c++  java
  • scala学习笔记(8): 列表的map,flatMap,zip和reduce

    map,flatMap,zip和reduce函数可以让我们更容易处理列表函数。

    1 map函数
    map将一个函数应用于列表的每一个元素并且将其作为一个新的列表返回。
    我们可以这样对列表的元素进行平方:

    scala> list1
    res3: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    
    scala> list1.map(x=>x*x)
    res4: List[Int] = List(0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100)

    2 flatMap函数
    flatMap应用于每个序列元素会返回包含原始列表所有序列内的元素的列表。通过以下的例子会更好理解:

    scala> val list3 = 10 to 20 toList
    list3: List[Int] = List(10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
    
    scala> val list2 = 1 to 10 toList
    list2: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    
    scala> val list4 = List(list2, list3)
    list4: List[List[Int]] = List(List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), List(10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20))
    
    scala> list4.flatMap(x=>x.map(y=>y*2))
    res2: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40)
    

      

    我们可以看到有list4的元素是两个列表。我们调用flatMap分别处理这两个列表,并用map将这两个列表的元素平方,最后的结果是一个包含所有元素的平坦的列表。

    注:flatMap并不一定用于元素是序列的列表,他只需要应用的函数返回的结果是GenTraversableOnce即可(列表的父类),例如:

    scala> List(1,2,3,4,5)
    res0: List[Int] = List(1, 2, 3, 4, 5)
    
    scala> res0.flatMap(x => 1 to x )
    res1: List[Int] = List(1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5)

    flatMap还可以看作是flatten和map两种的结合

    flatten将嵌套结构扁平化为一个层次的集合

    scala> List(List(1, 2), List(3, 4)).flatten
    res0: List[Int] = List(1, 2, 3, 4)
    

      

    scala> val nestedNumbers = List(List(1, 2), List(3, 4))
    nestedNumbers: List[List[Int]] = List(List(1, 2), List(3, 4))
    
    scala> nestedNumbers.flatMap(x => x.map(_ * 2))
    res0: List[Int] = List(2, 4, 6, 8)
    
    //等价于
    
    scala> nestedNumbers.map((x: List[Int]) => x.map(_ * 2)).flatten
    res1: List[Int] = List(2, 4, 6, 8)
    

      

    3 zip函数
    zip函数合并两个列表:

    scala> val list = "Hello.World".toCharArray
    list: Array[Char] = Array(H, e, l, l, o, ., W, o, r, l, d)
    
    scala> val list1 = 1 to 20 toList
    list1: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
    
    scala> list.zip(list1)
    res30: Array[(Char, Int)] = Array((H,1), (e,2), (l,3), (l,4), (o,5), (.,6), (W,7), (o,8), (r,9), (l,10), (d,11))
    
    scala> list1.zip(list)
    res31: List[(Int, Char)] = List((1,H), (2,e), (3,l), (4,l), (5,o), (6,.), (7,W), (8,o), (9,r), (10,l), (11,d))
    

      

    返回的列表长度取决于较短的列表,只要有一个列表到达了末尾zip函数就停止了。我们可以使用zipAll函数来对较长列表的剩余元素进行处理:

    scala> list.zipAll(list1,'a','1')
    res33: Array[(Char, AnyVal)] = Array((H,1), (e,2), (l,3), (l,4), (o,5), (.,6), (W,7), (o,8), (r,9), (l,10), (d,11), (a,12), (a,13), (a,14), (a,15), (a,16), (a,17), (a,18), (a,19), (a,20))


    (注:最后一个参数为1,让返回类型是Array[(Char,Int)]对于这个例子更好点)
    如果字母的列表比较短,那么用'a'来补充,反之用1来补充。最后一个要介绍的zip函数是zipWithIndex。就像他的名字一样,元素的下标(从0开始)会被增加进去:

    scala> list.zipWithIndex
    res36: Array[(Char, Int)] = Array((H,0), (e,1), (l,2), (l,3), (o,4), (.,5), (W,6), (o,7), (r,8), (l,9), (d,10))
    

      

    4 reduce函数
    使用reduce我们可以处理列表的每个元素并返回一个值。通过使用reduceLeft和reduceRight我们可以强制处理元素的方向。(使用reduce方向是不被保证的)
    注:reduce和fold很像,但reduce返回的值的类型必须和列表的元素类型相关(类型本身或其父类),但fold没有这种限制(但与此同时fold必须给定一个初始值),可以说reduce是fold的一种特殊情况。

    scala> list1
    res51: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
    
    scala> val sum = (x:Int, y:Int) => {println(x,y) ; x + y}
    sum: (Int, Int) => Int = <function2>
    
    scala> list1.reduce(sum)
    (1,2)
    (3,3)
    (6,4)
    (10,5)
    (15,6)
    (21,7)
    (28,8)
    (36,9)
    (45,10)
    (55,11)
    (66,12)
    (78,13)
    (91,14)
    (105,15)
    (120,16)
    (136,17)
    (153,18)
    (171,19)
    (190,20)
    res52: Int = 210
    
    scala> list1.reduceLeft(sum)
    (1,2)
    (3,3)
    (6,4)
    (10,5)
    (15,6)
    (21,7)
    (28,8)
    (36,9)
    (45,10)
    (55,11)
    (66,12)
    (78,13)
    (91,14)
    (105,15)
    (120,16)
    (136,17)
    (153,18)
    (171,19)
    (190,20)
    res53: Int = 210
    
    scala> list1.reduceRight(sum)
    (19,20)
    (18,39)
    (17,57)
    (16,74)
    (15,90)
    (14,105)
    (13,119)
    (12,132)
    (11,144)
    (10,155)
    (9,165)
    (8,174)
    (7,182)
    (6,189)
    (5,195)
    (4,200)
    (3,204)
    (2,207)
    (1,209)
    res54: Int =210
    

      

     

    参考资料
    ttp://www.ituring.com.cn/article/131442

    https://twitter.github.io/scala_school/zh_cn/collections.html#flatten

  • 相关阅读:
    关于Date相关函数在火狐Firefox和谷歌Chrome下的不同
    一键部署 LNMP 建站环境
    Python 返回值、方法和函数的区别
    Python中万物皆对象?的理解
    Python 实用小工具 练习(2)
    Chrome浏览器F12开发者工具使用教程博客汇总
    觅风易语言[21-24、30]
    觅风易语言[1-10]
    觅风易语言[11-20]
    Python Byte类型(API系列)
  • 原文地址:https://www.cnblogs.com/yxzfscg/p/4997182.html
Copyright © 2011-2022 走看看