Jea*_*let 35 collections scala map filter implicit-conversion
假设我有一个List[Int]
,我想调用toString
每个元素,并将结果作为a Vector[String]
.
在Scala中执行此操作的方法有哪些?是否有最少量显式输入的解决方案?- 即,我想指定我想要一个Vector
而不是一个List
,但我希望String
从过滤函数中推断出该参数.
或者我应该明确传递一个CanBuildFrom
实例?我从哪里得到这些 - 对于Seq
s,Set
s和Map
s?
oxb*_*kes 54
使用breakOut
as CanBuildFrom
,让typer知道你想要的结果类型(不幸的是你需要在这里指定String)
scala> import collection.breakOut
import collection.breakOut
scala> List(1, 2, 3)
res0: List[Int] = List(1, 2, 3)
scala> res0.map(_.toString)(breakOut) : Vector[String]
res2: Vector[String] = Vector(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
Scala 2.10.0引入了一种将集合转换为另一个集合的简单方法:
scala> List(1, 2, 3).map(_.toString).to[Vector]
res0: Vector[String] = Vector(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
或者IndexedSeq
明确要求:
scala> res0.map(_.toString).toIndexedSeq
res4: scala.collection.immutable.IndexedSeq[String] = Vector(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
如果你想在不创建中间体的情况下这样做List
,那么:
scala> res0.view.map(_.toString).toIndexedSeq
res5: scala.collection.immutable.IndexedSeq[String] = Vector(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
你可以使用自然变换(笨拙但更普遍)来做到这一点
scala> trait Trans[F[_], G[_]] {
| def f2g[A](f : F[A]) : G[A]
| }
defined trait Trans
Run Code Online (Sandbox Code Playgroud)
现在从List~> Vector转换中提供一个类型类实例:
scala> implicit val List2Vector = new Trans[List, collection.immutable.Vector] {
| def f2g[A](l : List[A]) : Vector[A] = l.map(identity[A])(collection.breakOut)
| }
List2Vector: java.lang.Object with Trans[List,scala.collection.immutable.Vector] = $anon$1@56329755
Run Code Online (Sandbox Code Playgroud)
定义包装器和隐式转换:
scala> class Clever[M[_], A](ma : M[A]) { def to[N[_]](implicit t : Trans[M, N]) : N[A] = t.f2g(ma) }
defined class Clever
scala> implicit def ma2clever[M[_], A](ma : M[A]) = new Clever[M, A](ma)
ma2clever: [M[_],A](ma: M[A])Clever[M,A]
Run Code Online (Sandbox Code Playgroud)
然后:
scala> List(1, 2, 3).map(_.toString).to[Vector]
res4: Vector[java.lang.String] = Vector(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
17816 次 |
最近记录: |