scala - 将 Scala Iterable[T] 转换为 Option[Iterable[S]],如果所有 T 都是 S 的实例,则填充?

标签 scala casting scala-collections scala-cats

我有一种模糊的感觉,这样的方法可能存在(可能在 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/

相关文章:

scala - Scala 中 scan 和 scanLeft 的区别

list - 将列表的元素与所有其他元素进行比较

scala - 使用 Dockerfile 安装 Docker

android - 如何管理从调用 Play2!-Scala REST 服务的 native 移动应用程序发送的用户请求的身份验证/授权

c++ - c++中static_cast是如何实现的?

c++ - 在 C++ 中将 double* 转换为 int*

arrays - 尝试在 Scala 中声明特定大小的数组

Scala 任一模式匹配

multithreading - 尝试更改内容时 Scala 摆动面板消失(仅在运行线程时)

java - 在 Kotlin 中安全转换为泛型类型时出现异常