首页 文章

关于缩写 Map 的困惑

提问于
浏览
4

我会想到以下代码:

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:字符串索引超出范围:在scala.collection.immutable.StringLike的java.lang.String.charAt(String.java:658)处为1 $ class.apply(StringLike.scala:52)at scala.collection.immutable.WrappedString.apply(WrappedString.scala:33)at scala.collection.immutable.WrappedString.apply(WrappedString.scala:33)at scala.collection . TraversableLike $$ anonfun $ map $ 1.apply(TraversableLike.scala:245)at scala.collection.TraversableLike $$ anonfun $ map $ 1.apply(TraversableLike.scala:245)at scala.collection.IndexedSeqOptimized $ class.foreach(IndexedSeqOptimized . 斯卡拉: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)

2 回答

  • 3

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

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

    现在,trait IndexedSeqOptimized[Char, String] 定义了一个抽象的应用方法 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 ) .

  • 7

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

    a.map("x")
    

    相当于

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

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

    如果你想要一个总是返回 "x" 的函数,那么你可以使用 Function.const

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

相关问题