• scala中的List


    实现将List中的每一个元素都加上一个前缀。

    方式一: 递归调用

    def dec(list : List[Int], prefix : String) {
    if (list != Nil) {
    println(prefix + list.head)
    dec(list.tail,prefix)
    }
    }

    // Exiting paste mode, now interpreting.

    dec: (list: List[Int], prefix: String)Unit

    scala> dec (List(1,2,3,4,5),"***")
    ***1
    ***2
    ***3
    ***4
    ***5

    方式二:for循环

    def dec2(list:List[Int],prefix:String) {
    for(num <- list) {
    println(prefix + num)
    }
    }

    // Exiting paste mode, now interpreting.

    dec2: (list: List[Int], prefix: String)Unit

    scala> dec2(List(1,2,3,4,5),"###")
    ###1
    ###2
    ###3
    ###4
    ###5

    List集合的几个常用的方法:

    //定义一个不可变List 

    scala> val  l1 = List(1,2,3,4,5)
    l1: List[Int] = List(1, 2, 3, 4, 5)

    //实现List中所有元素累加求和

    scala> l1.reduce(_+_)
    res87: Int = 15

    //从左向右,1-2-3-4-5 = -13。  

    scala> l1.reduceLeft((a,b) => {
    | println(s"a=${a} , b=${b}")
    | a-b
    | }
    | )
    a=1 , b=2
    a=-1 , b=3
    a=-4 , b=4
    a=-8 , b=5
    res88: Int = -13

    //从右向左,(1-(2-(3-(4-5)))) = 3.

    scala> l1.reduceRight((a,b) => {
    | println(s"a=${a} , b=${b}")
    | a-b
    | }
    | )
    a=4 , b=5
    a=3 , b=-1
    a=2 , b=4
    a=1 , b=-2
    res89: Int = 3

    //将a与b调换位置,得出的结果不同。

    scala> l1.reduceRight((a,b) => {
    | println(s"a=${a} , b=${b}")
    | b-a
    | }
    | )
    a=4 , b=5
    a=3 , b=1
    a=2 , b=-2
    a=1 , b=-4
    res91: Int = -5

    如果我们写成最简洁的形式,得到的结果是3.

    scala> l1.reduceRight(_-_)
    res92: Int = 3

    //fold在reduce的基础上多了一个参数,可以给一个初始值或者说起始值。

    scala> l1.fold(0)((a,b) => {
    | println(s"a=${a} , b=${b}")
    | b-a
    | }
    | )
    a=0 , b=1
    a=1 , b=2
    a=1 , b=3
    a=2 , b=4
    a=2 , b=5
    res93: Int = 3

    //这个例子更加清晰

    scala> l1.fold(100)((a,b) => {
    | println(s"a=${a} , b=${b}")
    | b-a
    | }
    | )
    a=100 , b=1
    a=-99 , b=2
    a=101 , b=3
    a=-98 , b=4
    a=102 , b=5
    res96: Int = -97

    //对比一下foldLeft 和 foldRight ,可以发现,foldLeft的第一个参数是累计值,而foldRight的第二个参数是累计值。

    scala> l1.foldRight("***")((a,b) => {
    | println(s"a=${a} , b=${b}")
    | b+a+"#"
    | }
    | )
    a=5 , b=***
    a=4 , b=***5#
    a=3 , b=***5#4#
    a=2 , b=***5#4#3#
    a=1 , b=***5#4#3#2#
    res97: String = ***5#4#3#2#1#

    scala> l1.foldLeft("***")((a,b) => {
    | println(s"a=${a} , b=${b}")
    | b+a+"#"
    | }
    | )
    a=*** , b=1
    a=1***# , b=2
    a=21***## , b=3
    a=321***### , b=4
    a=4321***#### , b=5
    res98: String = 54321***#####

    scala> l1.foldLeft("***")((a,b) => {
    | println(s"a=${a} , b=${b}")
    | a+b+"#"
    | }
    | )
    a=*** , b=1
    a=***1# , b=2
    a=***1#2# , b=3
    a=***1#2#3# , b=4
    a=***1#2#3#4# , b=5
    res99: String = ***1#2#3#4#5#

    //还有非常非常重要的map函数

    scala> l1.map("age : " + _)
    res101: List[String] = List(age : 1, age : 2, age : 3, age : 4, age : 5)

    //filter函数

    scala> l1.filter(_ >= 3)
    res102: List[Int] = List(3, 4, 5)

    //scala中 用 val l1 = List(1,2,3,4,5) 的方式创建出的集合是不可变集合,不能对集合元素做增删改的操作,否则会报错。

    scala> l1 + 6
    <console>:13: error: type mismatch;
    found : Int(6)
    required: String
    l1 + 6
    ^

    scala> l1
    res104: List[Int] = List(1, 2, 3, 4, 5)

    scala> l1(2) = 33
    <console>:13: error: value update is not a member of List[Int]
    l1(2) = 33

    //可以用  :: 和 ::: 追加元素。但这不意味着改变了 l1 的集合元素,只是返回了一个新的集合。

    scala> l1 ::: List(6)
    res106: List[Int] = List(1, 2, 3, 4, 5, 6)

    scala> l1 :: List(7,8,9)
    res110: List[Any] = List(List(1, 2, 3, 4, 5), 7, 8, 9)

    scala> List(7,8,9) :: l1
    res111: List[Any] = List(List(7, 8, 9), 1, 2, 3, 4, 5)

    scala> l1
    res107: List[Int] = List(1, 2, 3, 4, 5)











  • 相关阅读:
    基于flv.js自定义播放器UI界面
    使用node.js将xmind导出的excel转换为json树
    开启Hyper-V
    vue刷新当前路由
    react native练习
    mock js使用方法简单记录
    前端小技巧总结
    常用js函数开始收集~
    文字跳动
    cordova 修改状态栏的颜色,修改顶部电池字体颜色
  • 原文地址:https://www.cnblogs.com/rabbit624/p/10529153.html
Copyright © 2020-2023  润新知