【问题标题】:Confusion about abbreviating map关于缩写地图的困惑
【发布时间】:2015-04-24 18:08:26
【问题描述】:

我会想到下面的代码:

val a = Array(1, 2, 3, 4, 5)
println(a.map(n => "x"))

可以简写为:

val a = Array(1, 2, 3, 4, 5)
println(a.map("x"))

但后者给了我下面的例外。这是为什么呢?

java.lang.StringIndexOutOfBoundsException:字符串索引超出范围: 1 java.lang.StringIndexOutOfBoundsException:字符串索引超出 范围:1 在 java.lang.String.charAt(String.java:658) 在 scala.collection.immutable.StringLike$class.apply(StringLike.scala:52) 在 scala.collection.immutable.WrappedString.apply(WrappedString.scala:33) 在 scala.collection.immutable.WrappedString.apply(WrappedString.scala:33) 在 scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245) 在 scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245) 在 scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33) 在 scala.collection.mutable.ArrayOps$ofInt.foreach(ArrayOps.scala:234) 在 scala.collection.TraversableLike$class.map(TraversableLike.scala:245) 在 scala.collection.mutable.ArrayOps$ofInt.map(ArrayOps.scala:234)

【问题讨论】:

    标签: scala


    【解决方案1】:

    Strings 也是函数Int => Char,它将给定索引处的字符提取到字符串中。因此

    a.map("x")
    

    等价于

    a.map(i => "x".charAt(i))
    

    a 的第一个元素是1,因此这将尝试在字符串x 中的索引1 处查找超出范围的字符,因此出现异常。

    如果您想要一个始终返回"x" 的函数,那么您可以使用Function.const

    import Function.const
    a.map(const("x"))
    

    【讨论】:

    • 或者你也可以a.map(_ => "x")。这有点像使用identity 还是x => x 之间的争论。
    【解决方案2】:

    在 scala 中,String 只是 java.lang.Strings 的占位符类型。

    String 的所有实例都隐式转换为 scala.collection.immutable.StringOps,后者扩展了 trait StringLike[ String ],而后者又扩展了 trait IndexedSeqOptimized[Char, String]

    现在,trait IndexedSeqOptimized[Char, String] 定义了一个抽象的 apply 方法 apply(index: Int): Char,它由 trait StringLike[ String ] 实现。

    因此,每个像 val s = "A String" 这样的 String 实例都可以用作 Int => Char 类型的函数,就像这样 - val c = s( 0 )

    现在,您的a.map( "x" ) 等同于a.map( i => "x".apply( i ) )a.map( "x".apply( _ ) )a.map( i => ( "x" )( i ) ) 或简单的a.map( "x".apply )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 2020-03-06
      • 2016-03-16
      • 2013-07-27
      相关资源
      最近更新 更多