加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Scala中,有没有办法在Stream中获取当前评估的项目?

发布时间:2020-12-16 08:50:36 所属栏目:安全 来源:网络整理
导读:在 Scala中,有没有办法在Stream中获取当前评估的项目?例如在Stream中 val s: Stream[Int] = Stream.cons(1,Stream.cons(2,Stream.cons(3,s.map(_+1)))) 该方法应该只返回List(1,2,3). 解决方法 在2.8中,有一个名为tailDefined的受保护方法,当您到达尚未评估
在 Scala中,有没有办法在Stream中获取当前评估的项目?例如在Stream中

val s: Stream[Int] = Stream.cons(1,Stream.cons(2,Stream.cons(3,s.map(_+1))))

该方法应该只返回List(1,2,3).

解决方法

在2.8中,有一个名为tailDefined的受保护方法,当您到达尚未评估的流中的点时,该方法将返回false.

这不是太有用(除非你想编写自己的Stream类),除了Cons本身使方法公开.我不确定为什么它在Stream中受到保护而不在Cons中 – 我会认为其中一个可能是一个bug.但是现在,至少,你可以编写一个这样的方法(写一个功能等价物留给读者练习):

def streamEvalLen[T](s: Stream[T]) = {
  if (s.isEmpty) 0
  else {
    var i = 1
    var t = s
    while (t match {
      case c: Stream.Cons[_] => c.tailDefined
      case _ => false
    }) {
      i += 1
      t = t.tail
    }
    i
  }
}

在这里你可以看到它的实际效果:

scala> val s = Stream.iterate(0)(_+1)
s: scala.collection.immutable.Stream[Int] = Stream(0,?)

scala> streamEvalLen(s)
res0: Int = 1

scala> s.take(3).toList
res1: List[Int] = List(0,1,2)

scala> s
res2: scala.collection.immutable.Stream[Int] = Stream(0,?)

scala> streamEvalLen(s)
res3: Int = 3

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读