【问题标题】:Scala pattern match not working on Stream?Scala模式匹配不适用于Stream?
【发布时间】:2019-10-02 16:50:08
【问题描述】:

我做了一个分组,我得到key -> Stream(of values)

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

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

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

IDE 说toSeq 是多余的

【问题讨论】:

  • 你的模式匹配怎么样?,你在说哪个流,scala 一个,java 一个,akka 一个?,你能分享一个MCVE。 - 顺便说一句,如果您尝试使用 Nilx :: xs 对流本身进行模式匹配,那将不起作用,首先,这些特定于 List,其次通常流不是 ADT,因此它们不是模式可匹配的.

标签: scala


【解决方案1】:

当我使用 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)

【讨论】:

  • scala List 或 Seq 中主要使用什么集合?
  • ListSeq btw 的特定类型,(请参阅this question)...所以要使用哪种类型的Seq,实际上取决于您的用例... List 很常见,并且是标准的,如果您需要在恒定时间内访问头部...
【解决方案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,连接符号应该是#::,模式匹配应该是:

确保你反转 Stream - 所以你得到最后一个元素,这里是一个例子:

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

在这里查看ScalaFiddle

【讨论】:

  • Nil 不适用于流,您应该使用Stream.Empty,请参阅this。 - 顺便说一句,反转 可能 无限 集合似乎不是一个好主意。
  • @LuisMiguelMejíaSuárez:我们的模式匹配是Seq 而不是Stream(检查scalafiddle.io/sf/UdJCMhM/1)。 jakstack 要求是匹配最后一个元素 - 所以我假设 Stream 不是无限的 - 否则你当然是对的;)。
猜你喜欢
  • 2021-12-28
  • 2013-11-21
  • 1970-01-01
  • 2018-03-26
  • 2016-05-17
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多