Scala入门小纸条(3)

201. Iterable特质的方法有headlast headOption lastOption tail init length isEmpty map foreach collect flatMap reduceLeft reduceRight foldLeft foldRight reduce fold aggregate sum max min product count forall exists filter filterNot partition takeWhile dropWhile span take drop splitAt takeRight dropRight slice zip zipAll zipWithIndex grouped sliding mkString addString copyToArray copyToBuffer toSeq toArray toList toStream toSet toMap等

202. Seq特质在Iterable基础上又增加了方法,如contains startsWith  endsWith  containsSlice diff  indexOf lastIndexOf indexOfSlice indexWhere prefixLength segmentLength padTo intersect reverse sorted sortWith sortBy permutations combinations等

203. collect方法用于偏函数,即没有对所有可能的值进行定义的函数,它产出被定义的所有参数的函数值的集合,如"-3+4".collect {case '+' => 1; case '-' => -1}得到Vector(-1, 1)

204. reduceLeft和reduceRight都是二元的,如List(1,7,2,9).reduceLeft(_ - _)以及List(1,7,2,9) .reduceRight(_ - _),分别从集合的头部和尾部开始计算,得到-17和-13

205. foldLeft从某个初始值开始构造,而不是从首元素,如List(1,7,2,9).foldLeft(0)(_ - _),得到-19

206. 可以用/:操作符来完成foldLeft功能,如(0/: List(1,7,2,9))(_ - _) ,也得到-19;注意,/:操作符本意是想让你联想到一颗树的样子

207. Scala同样提供:\来完成foldRight功能,比如(List(1,7,2,9):\0)(_ - _),得到-13

208. 任何循环都可以用折叠来代替,比如原本用for循环实现的计算字符串中字母出现频率的代码,可以用折叠改写为,(Map[Char,Int]()/:"Mississippi"){(m,c) => m+(c->(m.getOrElse(c,0)+1))}

209. scanLeft和scanRight将折叠和映射操作结合在一起,得到包含所有中间结果的集合,如(1 to 10).scanLeft(0)(_ + _)得到 Vector(0, 1, 3, 6, 10, 15,21, 28, 36, 45, 55)

210. 拉链zip的用法,如 (prices zip quantities) map {p => p._1 *p._2},其中prices和quantities都是List或Array等集合;如果一个集合比另一个短,那么结果中的对偶数量和较短的元素数量相同

211. zipAll可以指定较短列表的缺省值,如List(5,20,9).zipAll(List(10,2),0.0,1)

212. zipWithIndex返回对偶的列表,其中每个对偶的第二个组成部分是每个元素的下标,如"scala".zipWithIndex得到Vector((s,0), (c,1), (a,2), (l,3), (a,4)),而"scala".zipWithIndex.max._2将得到0,因为s是"scala"中最大的字符

213. 可以用iterator方法从集合获得迭代器,此外Iterable(代表集合)还有一些方法可以产生迭代器比如sliding和grouped。另外,Source.fromFile也能产生一个迭代器,因为将整个文件读取到内存不是很高效的做法。如果觉得迭代器很繁琐,可以用toArray、toSeq、toMap等方法将相应的值拷贝到一个新的集合中

214. #::操作符很像列表的::,但它构造的是流,即stream, 比如def numsFrom(n:BigInt) :Stream[BigInt] =n#::numsFrom(n+1),当执行val s=numsFrom(10)就得到Stream(10, ?)的流对象,表示尾部是未被求值的,当调用s.tail.tail.tail就得到Stream(13, ?)

215. 流的方法是懒执行的,需要调用流•tail来强制对下一个元素求值

216. 如果想一次得到流的多个值,可以先take再force,比如val q=numsFrom(1) map {x=>x*x},然后q.take(5).force,就得到Stream(1, 4, 9, 16, 25),注意:如果直接调用q.force,将会导致oom,因为这是一个无穷流 

217. 可以用迭代器来构造流,比如Source.fromFile("...").getLines.toStream

218. 可以对任意scala集合调用view方法,来得到和流一样的懒执行效果,比如首先import scala.math._ 然后val p=(0 until 1000).view.map(pow(10, _))将产生未被求值的集合(哪怕第一个元素也未求值),然后执行p(100)就得到pow(10, 100),就是1.0E100,注意,和流不同,它不会缓存任何值;但和流一样,也可使用force来对懒视图强制求值

219. 懒集合对于处理需要以多种方式进行变换的大型集合是有好处的,它避免了构建出大型中间集合的需要,比如(0 until 1000).view.map(pow(10, _)).m

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值