flatMap function in scala
在以下两个场景中,我在列表上调用了 flatMap 函数。在这两种情况下, flatMap 函数的 map 部分都返回一个具有迭代器的数组。在第一种情况下,代码出错,在第二种情况下,它产生了预期的结果。
场景 1
1 2 3 4 5 6 |
场景 2
1 2 3 |
你能帮忙解释为什么在第一种情况下,它的行为不符合预期吗?
值得牢记的是,
1 2 | implicitly[Array[Char] <:< GenTraversableOnce[Char]] // error (Scala 2.12) implicitly[Array[Char] <:< IterableOnce[Char]] // error (Scala 2.13) |
因此因为
1 | String => GenTraversableOnce[Char] |
但我们正在传入
1 | String => Array[Char] |
编译器首先必须找到合适的
1 | scala.collection.immutable.List.apply[String]("abc","cde").flatMap[Char](((e: String) => scala.Predef.wrapCharArray(scala.Predef.augmentString(e).toArray[Char]((ClassTag.Char: scala.reflect.ClassTag[Char]))))) |
或更短
1 | List("abc","cde").flatMap(e => wrapCharArray(augmentString(e).toArray)) |
但是由于 Jasper-M 解释的类型推断原因,编译器无法选择
Array tries to be a JavaArray and a Scala Collection at the same
time. It mostly succeeds, but fail at both for some corner cases.
也许这是其中一种极端情况。由于这些原因,最好避免
1 | List("abc","cde").flatMap(_.to(Array)) |
我认为不同之处在于,在场景 1 中,您实际上有一个
您可以通过填写
来帮助类型推断
1 | List("abc","cde").flatMap(_.toArray[Char]) |
或者更好的是,在这种情况下您不需要
1 | List("abc","cde").flatten |
1 2 3 4 5 | scala> val x = List("abc","cde") x: List[String] = List(abc, cde) scala> x.flatMap[Char](_.toArray) res0: List[Char] = List(a, b, c, c, d, e) |
如错误所述,您的类型错误。
在第一种情况下,如果您应用地图而不是平面地图,您将获得 List[Array[Char]]。如果你对它应用 flatten,你会得到一个 List[Char]
在第二种情况下,如果您应用地图而不是平面地图,您将获得 List[Array[String]]。如果你对它应用 flatten,你会得到一个 List[String]
我想您需要将数组中的 String 转换为 Char,以使其工作。
我使用 Scala 2.13 并且仍然有同样的错误。