Scala Range与Stream

一 Range

  1. scala>1 to 10
  2. res20: scala.collection.immutable.Range.Inclusive=Range1 to 10
  3. scala>1 to 10 by 2
  4. res21: scala.collection.immutable.Range= inexact Range1 to 10 by 2
  5. scala>(1 to 10).toList
  6. res22:List[Int]=List(1,2,3,4,5,6,7,8,9,10)
  7. scala>1 until 10
  8. res23: scala.collection.immutable.Range=Range1 until 10
二 Stream
  1. scala>1#::2 #::3 #::Stream.empty
  2. res24: scala.collection.immutable.Stream[Int]=Stream(1,?)
  3. scala> val stream =(1 to 100000).toStream
  4. stream: scala.collection.immutable.Stream[Int]=Stream(1,?)
  5. scala> stream.head
  6. res25:Int=1
  7. scala> stream.tail
  8. res26: scala.collection.immutable.Stream[Int]=Stream(2,?)
Scala的`Stream`是一种惰性集合,它们只有在需要时才会计算元素。与`List`等严格集合不同,`Stream`可以表示无限序列,因为它只在需要时计算元素。这使得`Stream`非常适合处理大型数据集合,因为它们可以避免一次性加载整个数据集合到内存中。 `Stream`的创建方式与`List`相似,可以使用`cons`操作符`::`构建一个`Stream`,也可以使用`#::`操作符将元素添加到一个已存在的`Stream`中。下面是一些使用`Stream`的示例: ```scala // 创建一个从1到10的Stream val s1 = Stream.from(1).take(10) // 创建一个包含斐波那契数列的Stream val s2 = Stream.iterate((0, 1))(t => (t._2, t._1 + t._2)).map(_._1) // 创建一个空的Stream val s3 = Stream.empty[Int] // 将一个List转换成Stream val s4 = List(1, 2, 3).toStream ``` 与`List`不同,`Stream`可以表示无限序列,因此在访问元素时可能会发生无限循环。为了避免这种情况,可以使用`take`操作符来限制`Stream`的大小,或者使用`#::`操作符来将元素添加到一个已存在的`Stream`中。 下面是一些使用`Stream`的示例: ```scala // 计算从1到10的平方和 val sum = Stream.from(1).map(x => x * x).take(10).sum // 打印出斐波那契数列的前20个数字 Stream.iterate((0, 1))(t => (t._2, t._1 + t._2)).map(_._1).take(20).foreach(println) // 创建一个无限序列 val s = Stream.continually(scala.util.Random.nextInt(100)) // 将元素添加到一个已存在的Stream中 val s5 = 1 #:: 2 #:: 3 #:: s4 ``` 总之,`Stream`是一种非常有用的数据结构,它可以表示无限序列,并且可以避免一次性加载整个数据集合到内存中。但是,由于`Stream`是惰性计算的,因此在访问元素时需要注意避免无限循环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值