【发布时间】:2021-09-09 01:10:53
【问题描述】:
我有一种模糊的感觉,这种方法可能存在(可能在Cats?) - 目的是转为Iterable[T](或Set[T]是我真正感兴趣的) 转换为Option[Iterable[S]] - 结果是:
-
Some[Iterable[S]]:如果Iterable[T]中的所有 条目是S的实例 -
None:如果Iterable[T]中的任何条目不是S的实例
我知道在 Cats 中已经有一种类似的方法,由 Alternative 授予 - 它是 separate:
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] 感兴趣。
collect 呢?
此代码使用 Scala 标准库方法 collect 将编译 - 但请注意,它始终会生成 Set[S] - 即使某些 setOfT 不是 S 的实例:
val setOfT: Set[T] = ???
val setOfS: Set[S] = setOfT.collect {case s: S => s}
【问题讨论】:
-
如果你有任意类型,由于类型擦除,这不能开箱即用。您要么需要为某些类型的子集编写特定的方法,要么创建自己的 typeclass 来验证数据。 - 或者您可以使用运行时反射并为类型擦除打开错误之门。
标签: scala casting scala-collections scala-cats