`
bit1129
  • 浏览: 1068139 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Scala十七】Scala核心十一:下划线_的用法

 
阅读更多

下划线_在Scala中广泛应用,_的基本含义是作为占位符使用。_在使用时是出问题非常多的地方,本文将不断完善_的使用场景以及所表达的含义

 

1. 在高阶函数中使用

scala> val list = List(-3,8,7,9)
list: List[Int] = List(-3, 8, 7, 9)

scala> list.filter(_ > 7)
res8: List[Int] = List(8, 9)

 

_ > 7是一个函数字面量,_表示调用这个函数时提供的参数值,按理说,应该指定类型,但是这里没有指定,原因是可以通过filter操作推导出来

 

如下写法不对:

scala> list.filter(_:Int=>_>7)
<console>:1: error: identifier expected but integer literal found.
       list.filter(_:Int=>_>7)
                            ^

 

 

2. 省略函数列表

 

scala> val f = (_:Int) + (_:Int)
f: (Int, Int) => Int = <function2>

scala> f(2,3)
res11: Int = 5

scala> val f=(x:Int,y:Int)=>x+y
f: (Int, Int) => Int = <function2>

scala> f(2,3)
res12: Int = 5

 

 通过val f = (_:Int) + (_:Int),我们只定义了函数f的方法体,并没有指定函数的参数列表,_和_分表表示第一个和第二个参数,

_ + _ expands into a literal for a function that takes two parameters.

限制: You can use this short form only if each parameter appears in the function literal at most once. (我认为是exactly once)Multiple underscores mean multiple parameters,not reuse of a single parameter repeatedly. The first underscore represents the first parameter, the second underscore the second parameter, the third underscore the third parameter, and so on.

 

 

 

如下定义错误:

scala> val f = _ + _
<console>:7: error: missing parameter type for expanded function ((x$1, x$2) => x$1.$plus(x$2))
       val f = _ + _
               ^
<console>:7: error: missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.$plus(x$2))
       val f = _ + _
                   ^

 

但是如下操作正确

scala> val list = List(-3,8,7,9)
list: List[Int] = List(-3, 8, 7, 9)

scala> list.reduce(_ + _)
res13: Int = 21

 

3. 部分应用函数

scala> val f = (a:Int,b:Int,c:Int)=>a+b+c
f: (Int, Int, Int) => Int = <function3>

scala> val sum = f _
sum: () => (Int, Int, Int) => Int = <function0>

 

 如下写法错误:

 

scala> val sum = f(1) _
<console>:9: error: not enough arguments for method apply: (v1: Int, v2: Int, v3: Int)Int in trait Function3.
Unspecified value parameters v2, v3.
       val sum = f(1) _
                  ^

 

如下写法正确

scala> val sum = f(1,_:Int,_:Int)
sum: (Int, Int) => Int = <function2>

 

如下写法错误:

scala> val sum = f(1,_,_)
<console>:9: error: missing parameter type for expanded function ((x$1, x$2) => f(1, x$1, x$2))
       val sum = f(1,_,_)
                     ^
<console>:9: error: missing parameter type for expanded function ((x$1: <error>, x$2) => f(1, x$1, x$2))
       val sum = f(1,_,_)
                       ^

 原因是,f函数可能会有重载,假如f有两个具有三个参数的重载函数,那么调用f(1,_,_),编译器将不知道调用哪个函数将第一个参数(这里是1)代入,而f _则没有参数代入的步骤,这个在后期进行参数应用时,才会找具体的f

 关于这个问题,http://stackoverflow.com/questions/8549393/redundant-parameter-type-info-in-partially-applied-function-definition有讨论

 

分享到:
评论

相关推荐

    大数据课程-Scala编程基础-3.Scala面对对象的特性_lk_edit.ppt

    包的命名遵循一定的规则,如只允许数字、字母、下划线和小圆点,并且不能以数字开头,不应使用关键字。推荐的命名规范是小写字母加小圆点,表示公司的层次结构,例如`com.lkyoo.oa.model`。包的主要作用包括区分同名...

    03Scala下划线的使用

    1.方法转换为函数 scala&gt; def m(x:Int,y:Int) = x*y m: (x: Int, y: Int)Int scala&gt; val f = m _ f: (Int, Int) =&gt; Int = 2.集合中的每一个元素 scala&gt; val list = List(1,2,3,4) list: List[Int] = List(1, 2, 3, ...

    Scala开发规范_最新版本

    - 注释应简洁明了,描述功能和使用方法,避免过于冗余。 遵循以上规范,可以有效地提高Scala项目的质量和可维护性。在实际开发中,还应持续学习和适应Scala的最新特性和最佳实践,确保代码风格的一致性和团队协作...

    Scala语言入门

    - **导入包中的所有类**:如果需要导入包中的所有类,则可以使用下划线`_`。例如: ```scala import java.util._ ``` - **导入静态成员**:Scala中没有静态成员的概念,但可以通过导入类的所有成员来达到类似的...

    scala教材.docx

    5. **部分应用函数**:通过使用下划线 `_`,你可以创建部分应用的函数。例如,`val add2 = adder(2, _:Int)` 将 `adder` 函数的部分参数预先填入,生成一个新的接受一个参数的函数。 6. **类型系统**:Scala 有强大...

    scala 操作RDD的代码分析实例

    * 导包引入:在导包时,可以使用下划线来引入整个包,例如 `import scala.collection.mutable._` * 初始化变量:在初始化变量时,可以使用下划线作为默认值,例如 `var name:String=_` 3. transform 操作 在代码中...

    scala的操作笔记

    使用下划线(`_`)符号,可以将方法转换为函数。这种转换机制使得方法可以作为参数传递给其他函数,提高了代码的灵活性。 #### 五、Scala进阶概念 ##### 5.1 数组、映射、元组、集合 - **数组**:Scala支持定长数组...

    Scala入门学习教程.docx

    另外,Scala 语言使用下划线(_)而不是星号(*)来导入所有的类或者符号。 本资源摘要信息为 Scala 入门学习教程,旨在帮助读者快速掌握 Scala 语言的基本概念和编程技术。该教程涵盖了 Scala 语言的基本语法、...

    scala ppt文档

    Scala允许使用非字母数字的标识符作为方法名,这就包括了我们通常视为运算符的字符。例如,字符串`s`调用 `indexOf('o')` 实际上等同于 `s indexOf 'o'`。这里,`indexOf` 成为了一个后缀运算符,因为它位于实例`s`...

    SCALA 入门材料

    - **神奇的下划线**:Scala提供了一种特殊的语法糖——下划线,用于将方法转换为函数,简化函数式编程的操作。 #### 数据结构 - **数组**:Scala支持定长数组与变长数组。 - **遍历**:通过增强的for循环或利用`...

    scala语言规范

    - **标识符**:Scala 的标识符可以由字母、数字、下划线 `_` 和美元符号 `$` 组成,但不能以数字开头。它们遵循特定的规则,例如变量名、函数名等。 - **换行字符**:在 Scala 中,换行字符通常作为语句的结束标记...

    scala-inflector_2.11-1.3.5.zip

    Scala Inflector 是一个针对 Scala 语言的开源项目,它的主要功能是提供文本处理能力,特别是对英语名词的复数化、单数化、驼峰命名(CamelCase)与下划线命名(snake_case)之间的转换等。这个项目在 Scala 社区中...

    scala从入门到精通技术教学视频

    05.使用下划线初始化成员变量 06.定义和访问成员方法 07.访问权限修饰符 08.主构造器 09.辅助构造器 10.定义单例对象 11,在单例对象中定义方法 12.如何定义程序的主入口 13.定义伴生对象 14.private[this]...

    Scala语言参考 PDF

    类型系统是Scala的一个核心部分,它包括基本类型(Value Types)如Int、Double、Boolean等,以及复杂类型如单例类型(Singleton Types)、类型投影(Type Projection)、类型设计ator(Type Designators)、参数化...

    Scala-简易详解文章

    4. **运算符**:Scala中的运算符实际上是方法调用,比如`+`是`add`方法的别名。运算符重载允许自定义操作符行为。 5. **语句块与流程控制**:Scala的流程控制结构包括条件语句(`if/else`)、循环(`for`、`while`...

    Scala简单说明

    例如,Scala推荐使用下划线分隔的驼峰命名法来命名变量和方法。 #### Scala脚本入门 Scala也支持脚本式编程。通过`.scala`文件可以直接执行Scala代码,无需编译成.class文件再执行,这为快速原型设计提供了便利。 ...

    Scala Reference

    - **标识符(Identifiers)**:在Scala中,标识符可以包含字母、数字和下划线,但不能以数字开头。它们用于定义变量、类、方法等。 - **换行字符**:Scala允许在表达式中使用换行符作为分隔符,也可以通过分号来...

    Scala Cheat Sheet

    此外,控制流程的break语句在Scala中并不是内建的,如果需要中断循环,可以使用Scala.util.control.Breaks包下的breakable方法。 需要注意的是,提供的文件内容中存在一些OCR扫描错误,如“importscala.collection....

Global site tag (gtag.js) - Google Analytics