我有一种模糊的感觉,这样的方法可能存在(可能在 Cats 中?) - 目的是转变一个 Iterable[T]
(或 Set [T]
是我真正感兴趣的)到 Option[Iterable[S]]
- 结果是:
Some[Iterable[S]]
:如果Iterable[T]
中的所有条目都是S< 的实例
None
:如果Iterable[T]
中的任何条目不是S
的实例
我知道 Cats 中已经有一种类似的方法,由 Alternative
授予。 - 它是单独的
:
import cats.implicits._
import alleycats.std.set._
val stringsAndInts: Set[Either[String, Int]] = Set(Right(6),Left("Foo"))
val (strings: Set[String], ints: Set[Int]) = stringsAndInts.separate
...这对于 Set[Either[A,B]
效果很好 - 但对于这个问题,我只对任何旧的 Set[T]
感兴趣.
收集
怎么样?
此代码使用Scala标准库方法collect
将编译 - 但请注意,它始终会生成 Set[S]
- 即使某些 setOfT
不是 S
的实例:
val setOfT: Set[T] = ???
val setOfS: Set[S] = setOfT.collect {case s: S => s}
最佳答案
考虑无形类型安全类型转换
import shapeless._
import syntax.typeable._
val xs: Set[Any] = Set("picard", "worf")
xs.cast[Set[Int]]
// res1: Option[Set[Int]] = None
xs.cast[Set[String]]
// res2: Option[Set[String]] = Some(value = Set("picard", "worf"))
如果您希望具有与 collect
类似的功能,并且类路径上已经有猫,那么这里是一行代码
import alleycats.std.set._
animals.map(implicitly[ClassTag[Dog]].unapply).sequence
Option[Set[Dog]]
的类型。
关于scala - 将 Scala Iterable[T] 转换为 Option[Iterable[S]],如果所有 T 都是 S 的实例,则填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68134401/