【问题标题】:Scala: join iterators with values in a wrapperScala:将迭代器与包装器中的值连接起来
【发布时间】:2015-12-12 06:38:19
【问题描述】:

我有以下类型:ABC,所以B <: AC <: A

我需要得到像这样工作的Iterator[A]

  • 如果当前值为B类型,则返回B

  • 如果当前值的类型为C,则调用函数parse(c: C) : Iterator[B],然后使用此迭代器直到它耗尽。然后继续使用“父”迭代器中的值。

在 Scala 中最好的方法是什么?

【问题讨论】:

  • 我们是否应该假定如果该值是类型A 但不是BC,那么该值应该被丢弃?还是你很高兴它抛出 MatchError 让你捕捉?

标签: scala collections iterator flatten


【解决方案1】:

使用模式匹配和flatMap:

val itA: Iterator[A] = // ...
val itB: Iterator[B] = itA.flatMap(a => a match {
  case b: B => Iterator(b)
  case c: C => parse(c)
})

【讨论】:

  • 该技术是正确的,但如果itA 中的值是A 类型但不是'B' 或C,此示例不会抛出MatchError?我意识到 OP 在这种情况下没有指定所需的行为。
猜你喜欢
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 2020-11-07
  • 2017-09-11
  • 2023-01-14
  • 2017-06-25
相关资源
最近更新 更多