Scala模式匹配在Stream上不起作用?

时间:2019-05-15 13:55:00

标签: scala

我进行分组,我得到key -> Stream(of values)

然后我需要在流集合上进行模式匹配以访问最后一个项目 但是模式匹配不起作用。

当我使用Seq手动构建值列表时,相同的模式匹配代码有效

所以我的问题是否有办法将Stream转换为Seq或List?

IDE表示toSeq是多余的

2 个答案:

答案 0 :(得分:4)

  

当我使用Seq手动构建值列表时,相同的模式匹配代码有效

在scala 2.12中,Seq(或序列)默认为List,请参见以下question

scala> Seq(1,2,3)
res3: Seq[Int] = List(1, 2, 3)

这可能就是为什么模式匹配在您的序列(碰巧是List)而不是Stream上起作用的原因,请参见question

  

IDE说toSeq是多余的

Stream确实是Seq

Stream(1,2,3).toSeq
res4: collection.immutable.Seq[Int] = Stream(1, 2, 3)
  

所以我的问题是否有办法将Stream转换为Seq或List?

要将Stream转换为List,可以调用.toList方法:

Stream(1,2,3).toList
res5: List[Int] = List(1, 2, 3)

答案 1 :(得分:2)

或者使用此Answer,您不必转换为List

val n: Seq[Any] = Stream(..)
n match {
    case Nil => "Empty"
    case h :: t => "Non-empty"
    case h #:: t => "Non-empty stream"
  }
  

对于Stream,concat符号应为#::,模式匹配应为:

请确保您反转了Stream-这样就得到了最后一个元素,这里是一个示例:

n.reverse match {
    case Nil => "Empty"
    case h #:: _ => s"last element is $h"
  }

在这里ScalaFiddle

检查