美文网首页
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