gpt4 book ai didi

scala - 是否可以在 Iterable 上进行模式匹配

转载 作者:行者123 更新时间:2023-12-03 21:22:05 26 4
gpt4 key购买 nike

它有一种优雅的方式在 scala 上进行模式匹配 Iterable[A]集合,检查它是否为空,是否仅包含一个元素(并获取它),是否恰好包含 N 个元素(并获取它们),是否包含至少一个或多个元素(并获取它或它们),以及很快。

List这很简单,但我无法获得 Iterable 的等价物在职的。

最佳答案

您想通过以下方式进行模式匹配吗?

val it: Iterable[Int] = ...
it match {
case Iterable(1, a, b) => ...
case Iterable(a, b) => ...
case Iterable() =>
}

如果是,实际上你不能这样做,因为 Iterable 的伴生对象没有 unapplySeq方法。因此,最简单的方法是显式转换 IterableSeq :
val it: Iterable[Int] = ...
it.toSeq match {
case Seq(1, a, b) => ...
case Seq(a, b) => ...
case Seq() =>
}

或者如果您不想转换 IterableSeq每次手动,你可以使用这样的东西:
object iterable {
def unapplySeq[A](it: Iterable[A]): Option[Seq[A]] = Some(it.toSeq)
}
val it: Iterable[Int] = ...
it match {
case iterable(1, a, b) => ...
case iterable(a, b) => ...
case iterable() =>
}

但请注意,基础集合可能不是 Seq .这种方法可能会导致复制整个 Iterable进入一个新的收藏。

编辑:
Iterable可能是无限的。在这种情况下 .toSeq可能会使您的程序崩溃。
所以最安全的方法是调用 .take(n)模式匹配之前

关于scala - 是否可以在 Iterable 上进行模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52761487/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com