美文网首页
Scala School-2-集合

Scala School-2-集合

作者: 匿称也不行 | 来源:发表于2019-03-01 02:54 被阅读0次

    基本数据结构

    • 数组Array

    数组本身的元素是有序的,可重复的,可变的;

    val numbers = Array(1,2,3,4,5)
    numbers(1)
    numbers(1) = 6
    numbers
    
    numbers: Array[Int] = Array(1, 6, 3, 4, 5)
    res702: Array[Int] = Array(1, 6, 3, 4, 5)
    
    • 列表List

    列表本身的元素是有序的,可重复的,不可变的

    val numbers = List(1,2,3,4,5)
    numbers(1)
    numbers(1) = 6
    numbers
    
    <console>:33: error: value update is not a member of List[Int]
           numbers(1) = 6
    
    • 集合Set

    集合本身的元素是无序的,不可重复的,不可变的

    scala> val numbers = Set(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
    numbers: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)
    
    • 元组Tuple

    简单的逻辑集合

    scala> val hostPort = ("localhost", 80)
    hostPort: (String, Int) = (localhost, 80)
    

    元组不通过index,而是根据下标来读取对象,而且下标起点为1,而不是0;

    元组还有一个特殊的生成形式

    scala> 1->2
    res704: (Int, Int) = (1,2)
    

    这个看起来就和Map的元素一样了,确实也是。

    • 映射Map

    可以用->,也可以用元组形式来生成。

    scala> Map(1->2)
    res705: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2)
    
    scala> Map((1,2))
    res710: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2)
    
    scala> Map((1,2))==Map(1->2)
    res711: Boolean = true
    
    • Option

    一个容器,其中有可能有包含的值;

    scala> val numbers = Map("one" -> 1, "two" -> 2)
    numbers: scala.collection.immutable.Map[java.lang.String,Int] = Map(one -> 1, two -> 2)
    scala> numbers("one")
    res712: Int = 1
    scala> numbers("one1")
    java.util.NoSuchElementException: key not found: one1
    scala> numbers.get("123")
    res714: Option[Int] = None
    scala> numbers.get("one")
    res715: Option[Int] = Some(1)
    

    如果想要获得Map中的元素,直接调取元素可能会有exception,如果key错误的话;
    但使用get就更安全,找不到就返回一个Option,其中可能有值Some(1),也可能没有None;

    函数组合子(Functional Combinators)

    这个概念就复杂多了。要精通短期来讲有点困难。。

    组合子是一个概念,将复杂事物简单化的逻辑概念。

    这个世界是数学概念组成的。

    这句话可能大家比较能接受了吧。那换做这一句呢?

    这个世界是函数组成的。

    这个可能有点绕。那么将所有数学中的概念对应为函数。

    概念:常数函数
    公理:函数值为真的命题函数,y=f(x)=true
    推理:上述函数组合而成的新函数,正确的话也为true
    

    这个概念在此不需要理解太深(我觉得,也许是愚见:))。只需要记得,我们可以将一切事物转化成函数的形式。那么这么做的好处是?

    我们可以把复杂的事情简单化,就像是:

    expectedResult(x) = a(b(c(d(e...(x)))))
    

    这里a,b,c...都是函数。

    也就是说,我们对于某个基础内容x,可以进行一系列的操作,从而达到目的。典型的函数组合子如下(边学边理解吧,用文字比较难以形成感觉)。

    • map

    对列表的每一个元素应用一个函数,所以map这个函数本身是针对列表类型的,接受的参数为一个函数,f = element => trans_element,返回[trans_element]列表。

    • foreach

    和上面类似,但是它本身不会返回任何值,从而无法作为一种可链接的函数。它的作用需要取决于其参数函数的side effect。

    • filter

    参数函数是element => boolean的,也就是对每个元素做一个判断,符合条件的留下,否则舍弃。这种返回boolean值的函数也叫做谓词函数

    • zip

    合并两个列表,返回合并后的新列表。

    • partition

    接受一个谓词函数作为参数函数,返回[true_result, false_result]的分割列表。

    • find

    接受一个谓词函数作为参数函数,返回第一个true的元素。

    • foldLeft/foldRight
    def foldLeft [B] (z: B)(f: (B, A) => B): B//z需要提供,作为起步的初始值
    def reduceLeft [B >: A] (f: (B, A) => B): B//特例,签名要求B是A的子类
    

    从左往右,依次计算/更新结果B。比如List(1,2,3),从左往右求和,即:
    List(1,2,3).reduceLeft(_ + _)
    List(1,2,3).tail.foldLeft(List(1,2,3).head)(_ + _)

    • flatten

    将复合nested结构扁平化。

    scala> Array(Array(1,2), Array(3,4,5)).flatten
    res122: Array[Int] = Array(1, 2, 3, 4, 5)
    
    • flatMap

    先map再flatten。

    相关文章

      网友评论

          本文标题:Scala School-2-集合

          本文链接:https://www.haomeiwen.com/subject/lnqruqtx.html