From c576132d42d808592c486e79fa98cc02d146fd54 Mon Sep 17 00:00:00 2001 From: heibaiying <2806718453@qq.com> Date: Fri, 14 Jun 2019 17:25:17 +0800 Subject: [PATCH] scala Traversable & Iterable --- notes/Scala集合类型.md | 160 +++++++++++++++++- ...d => 大数据技术栈思维导图.xmind} | Bin 2 files changed, 158 insertions(+), 2 deletions(-) rename pictures/{大数据技术栈.xmind => 大数据技术栈思维导图.xmind} (100%) diff --git a/notes/Scala集合类型.md b/notes/Scala集合类型.md index d4effd3..986f5f5 100644 --- a/notes/Scala集合类型.md +++ b/notes/Scala集合类型.md @@ -66,13 +66,169 @@ Scala中所有集合的顶层实现是`Traversable` 。它唯一的抽象方法 def foreach[U](f: Elem => U) ``` -实现`Traversable`的集合类只需要实现这个抽象方法,所有其他方法都可以从`Traversable继承`。Traversable中一共定义了几十种关于集合操作方法,关于这些方法的说明可以参考官方文档:[trait-traversable](https://docs.scala-lang.org/overviews/collections/trait-traversable.html)。 +实现`Traversable`的集合类只需要实现这个抽象方法,其他方法可以从`Traversable`继承。`Traversable`中的所有可用方法如下: + +| **方法** | **作用** | +| ----------------------------------- | ------------------------------------------------------------ | +| **Abstract Method:** | | +| `xs foreach f` | 为 xs 的每个元素执行函数 f | +| **Addition:** | | +| `xs ++ ys` | 一个包含 xs 和 ys 中所有元素的新的集合。 ys 是一个 Traversable 或 Iterator。 | +| **Maps:** | | +| `xs map f` | 对 xs 中每一个元素应用函数 f,并返回一个新的集合 | +| `xs flatMap f` | 对 xs 中每一个元素应用函数 f,最后将结果合并成一个新的集合 | +| `xs collect f` | 对 xs 中每一个元素调用偏函数 f,并返回一个新的集合 | +| **Conversions:** | | +| `xs.toArray` | 将集合转化为一个 Array | +| `xs.toList` | 将集合转化为一个 List | +| `xs.toIterable` | 将集合转化为一个 Iterable | +| `xs.toSeq` | 将集合转化为一个 Seq | +| `xs.toIndexedSeq` | 将集合转化为一个 IndexedSeq | +| `xs.toStream` | 将集合转化为一个延迟计算的流 | +| `xs.toSet` | 将集合转化为一个 Set | +| `xs.toMap` | 将一个(key, value)对的集合转化为一个Map。 如果当前集合的元素类型不是(key, value)对形式, 则报静态类型错误。 | +| **Copying:** | | +| `xs copyToBuffer buf` | 拷贝集合中所有元素到缓存 buf | +| `xs copyToArray(arr,s,n)` | 从索引 s 开始,将集合中最多 n 个元素复制到数组 arr。 最后两个参数是可选的。 | +| **Size info:** | | +| `xs.isEmpty` | 判断集合是否为空 | +| `xs.nonEmpty` | 判断集合是否包含元素 | +| `xs.size` | 返回集合中元素的个数 | +| `xs.hasDefiniteSize` | 如果 xs 具有有限大小,则为真。 | +| **Element Retrieval:** | | +| `xs.head` | 返回集合中的第一个元素(如果无序,则随机返回) | +| `xs.headOption` | 以 Option 的方式返回集合中的第一个元素, 如果集合为空则返回 None | +| `xs.last` | 返回集合中的最后一个元素(如果无序,则随机返回) | +| `xs.lastOption` | 以 Option 的方式返回集合中的最后一个元素, 如果集合为空则返回 None | +| `xs find p` | 以 Option 的方式返回满足条件 p 的第一个元素, 如果都不满足则返回 None | +| **Subcollection:** | | +| `xs.tail` | 除了第一个元素之外的其他元素组成的集合 | +| `xs.init` | 除了最后一个元素之外的其他元素组成的集合 | +| `xs slice (from, to)` | 返回给定索引范围之内的元素组成的集合 (包含 from 位置的元素但不包含 to 位置的元素) | +| `xs take n` | 返回 xs 的前n个元素组成的集合(如果无序,则返回任意n个元素) | +| `xs drop n` | 返回 xs 的后n个元素组成的集合(如果无序,则返回任意n个元素) | +| `xs takeWhile p` | 从第一个元素开始查找满足条件 p 的元素, 直到遇到一个不满足条件的元素,返回所有遍历到的值。 | +| `xs dropWhile p` | 从第一个元素开始查找满足条件 p 的元素, 直到遇到一个不满足条件的元素,返回所有未遍历到的值。 | +| `xs filter p` | 返回满足条件 p 的所有元素的集合 | +| `xs withFilter p` | 集合的非严格的过滤器。后续对 xs 调用方法 map、flatMap 以及 withFilter 都只用作于满足条件 p 的元素,而忽略其他元素 | +| `xs filterNot p` | 返回不满足条件 p 的所有元素组成的集合 | +| **Subdivisions:** | | +| `xs splitAt n` | 在给定位置拆分集合,返回一个集合对 (xs take n, xs drop n) | +| `xs span p` | 根据给定条件拆分集合,返回一个集合对(xs takeWhile p, xs dropWhile p)。即遍历元素,直到遇到第一个不符合条件的值则结束遍历,将遍历到的值和未遍历到的值分别放入两个集合返回。 | +| `xs partition p` | 按照筛选条件对元素进行分组 | +| `xs groupBy f` | 根据鉴别器函数 f 将 xs 划分为集合映射 | +| **Element Conditions:** | | +| `xs forall p` | 判断集合中所有的元素是否都满足条件 p | +| `xs exists p` | 判断集合中是否存在一个元素满足条件 p | +| `xs count p` | xs 中满足条件 p 的元素的个数 | +| **Folds:** | | +| `(z /: xs) (op)` | 以 z 为初始值,从左到右对 xs 中的元素执行操作为 op 的归约操作 | +| `(xs :\ z) (op)` | 以 z 为初始值,从右到左对 xs 中的元素执行操作为 op 的归约操作 | +| `xs.foldLeft(z) (op)` | 同 (z /: xs) (op) | +| `xs.foldRight(z) (op)` | 同 (xs :\ z) (op) | +| `xs reduceLeft op` | 从左到右对 xs 中的元素执行操作为 op 的归约操作 | +| `xs reduceRight op` | 从右到左对 xs 中的元素执行操作为 op 的归约操作 | +| **Specific Folds:** | | +| `xs.sum` | 累计求和 | +| `xs.product` | 累计求积 | +| `xs.min` | xs 中的最小值 | +| `xs.max` | xs 中的最大值 | +| **String:** | | +| `xs addString (b, start, sep, end)` | 向 StringBuilder b 中添加一个字符串, 该字符串包含 xs 的所有元素。start、seq 和 end 都是可选的,seq 为分隔符,start 为开始符号,end 为结束符号。 | +| `xs mkString (start, seq, end)` | 将集合转化为一个字符串。start、seq 和 end 都是可选的,seq 为分隔符,start 为开始符号,end 为结束符号。 | +| `xs.stringPrefix` | 返回 xs.toString 字符串开头的集合名称 | +| **Views:** | | +| `xs.view` | 生成 xs 的视图 | +| `xs view (from, to)` | 生成 xs上指定索引范围内元素的视图 | + + + +下面为部分方法的使用示例: + +```scala +scala> List(1, 2, 3, 4, 5, 6).collect { case i if i % 2 == 0 => i * 10 } +res0: List[Int] = List(20, 40, 60) + +scala> List(1, 2, 3, 4, 5, 6).withFilter(_ % 2 == 0).map(_ * 10) +res1: List[Int] = List(20, 40, 60) + +scala> (10 /: List(1, 2, 3)) (_ + _) +res2: Int = 16 + +scala> List(1, 2, 3, -4, 5) takeWhile (_ > 0) +res3: List[Int] = List(1, 2, 3) + +scala> List(1, 2, 3, -4, 5) span (_ > 0) +res4: (List[Int], List[Int]) = (List(1, 2, 3),List(-4, 5)) + +scala> List(1, 2, 3).mkString("[","-","]") +res5: String = [1-2-3] +``` ## 四、Trait Iterable -Scala中所有的集合都直接或者间接实现了`Iterable`特质,`Iterable`拓展自`Traversable`,并额外定义了十几种方法,关于这些方法的用途,官方文档上同样也有详细的说明:[trait-iterable](https://docs.scala-lang.org/overviews/collections/trait-iterable.html)。 +Scala中所有的集合都直接或者间接实现了`Iterable`特质,`Iterable`拓展自`Traversable`,并额外定义了部分方法: + +| **方法** | **作用** | +| ---------------------- | ------------------------------------------------------------ | +| **Abstract Method:** | | +| `xs.iterator` | 返回一个迭代器,用于遍历 xs 中的元素, 与foreach遍历元素的顺序相同。 | +| **Other Iterators:** | | +| `xs grouped size` | 返回一个固定大小的迭代器 | +| `xs sliding size` | 返回一个固定大小的滑动窗口的迭代器 | +| **Subcollections:** | | +| `xs takeRigtht n` | 返回 xs 中最后 n 个元素组成的集合(如果无序,则返回任意 n 个元素组成的集合) | +| `xs dropRight n` | 返回 xs 中除了最后 n 个元素外的部分 | +| **Zippers:** | | +| `xs zip ys` | 返回 xs 和 ys 的对应位置上的元素对组成的集合 | +| `xs zipAll (ys, x, y)` | 返回 xs 和 ys 的对应位置上的元素对组成的集合。其中较短的序列通过附加元素 x 或 y 来扩展以匹配较长的序列。 | +| `xs.zipWithIndex` | 返回一个由 xs 中元素及其索引所组成的元素对的集合 | +| **Comparison:** | | +| `xs sameElements ys` | 测试 xs 和 ys 是否包含相同顺序的相同元素 | + +所有方法示例如下: + +```scala +scala> List(1, 2, 3).iterator.reduce(_ * _ * 10) +res0: Int = 600 + +scala> List("a","b","c","d","e") grouped 2 foreach println +List(a, b) +List(c, d) +List(e) + +scala> List("a","b","c","d","e") sliding 2 foreach println +List(a, b) +List(b, c) +List(c, d) +List(d, e) + +scala> List("a","b","c","d","e").takeRight(3) +res1: List[String] = List(c, d, e) + +scala> List("a","b","c","d","e").dropRight(3) +res2: List[String] = List(a, b) + +scala> List("a","b","c").zip(List(1,2,3)) +res3: List[(String, Int)] = List((a,1), (b,2), (c,3)) + +scala> List("a","b","c","d").zipAll(List(1,2,3),"",4) +res4: List[(String, Int)] = List((a,1), (b,2), (c,3), (d,4)) + +scala> List("a","b","c").zipAll(List(1,2,3,4),"d","") +res5: List[(String, Any)] = List((a,1), (b,2), (c,3), (d,4)) + +scala> List("a", "b", "c").zipWithIndex +res6: List[(String, Int)] = List((a,0), (b,1), (c,2)) + +scala> List("a", "b") sameElements List("a", "b") +res7: Boolean = true + +scala> List("a", "b") sameElements List("b", "a") +res8: Boolean = false +``` diff --git a/pictures/大数据技术栈.xmind b/pictures/大数据技术栈思维导图.xmind similarity index 100% rename from pictures/大数据技术栈.xmind rename to pictures/大数据技术栈思维导图.xmind