Scala基础 - 下划线使用指南
2018-01-24 23:20
239 查看
1. 用于替换Java的等价语法
由于大部分的Java关键字在Scala中拥有了新的含义,所以一些基本的语法在Scala中稍有变化。
1.1 导入通配符
*在Scala中是合法的方法名,所以导入包时要使用_代替。//Java import java.util.*; //Scala import java.util._
1.2 类成员默认值
Java中类成员可以不赋初始值,编译器会自动帮你设置一个合适的初始值:class Foo{ //String类型的默认值为null String s; }
而在Scala中必须要显式指定,如果你比较懒,可以用_让编译器自动帮你设置初始值:
class Foo{ //String类型的默认值为null var s: String = _ }
该语法只适用于类成员,而不适用于局部变量。
1.3 可变参数
Java声明可变参数如下:public static void printArgs(String ... args){ for(Object elem: args){ System.out.println(elem + " "); } }
调用方法如下:
//传入两个参数 printArgs("a", "b"); //也可以传入一个数组 printArgs(new String[]{"a", "b"});
在Java中可以直接将数组传给printArgs方法,但是在Scala中,你必须要明确的告诉编译器,你是想将集合作为一个独立的参数传进去,还是想将集合的元素传进去。如果是后者则要借助下划线:
printArgs(List("a", "b"): _*)
1.4 类型通配符
Java的泛型系统有一个通配符类型,例如List<?>,任意的List<T>类型都是List<?>的子类型,如果我们想编写一个可以打印所有List类型元素的方法,可以如下声明:public static void printList(List<?> list){ for(Object elem: list){ System.out.println(elem + " "); } }
对应的Scala版本为:
def printList(list: List[_]): Unit ={ list.foreach(elem => println(elem + " ")) }
2 模式匹配
2.1 默认匹配
str match{ case "1" => println("match 1") case _ => println("match default") }
2.2 匹配集合元素
//匹配以0开头,长度为三的列表 expr match { case List(0, _, _) => println("found it") case _ => } //匹配以0开头,长度任意的列表 expr match { case List(0, _*) => println("found it") case _ => } //匹配元组元素 expr match { case (0, _) => println("found it") case _ => } //将首元素赋值给head变量 val List(head, _*) = List("a")
3. Scala特有语法
3.1 访问Tuple元素
val t = (1, 2, 3) println(t._1, t._2, t._3)
3.2 简写函数字面量(function literal)
如果函数的参数在函数体内只出现一次,则可以使用下划线代替:val f1 = (_: Int) + (_: Int) //等价于 val f2 = (x: Int, y: Int) => x + y list.foreach(println(_)) //等价于 list.foreach(e => println(e)) list.filter(_ > 0) //等价于 list.filter(x => x > 0)
3.3 定义一元操作符
在Scala中,操作符其实就是方法,例如1 + 1等价于1.+(1),利用下划线我们可以定义自己的左置操作符,例如Scala中的负数就是用左置操作符实现的:-2 //等价于 2.unary_-
3.4 定义赋值操作符
我们通过下划线实现赋值操作符,从而可以精确地控制赋值过程:class Foo { def name = { "foo" } def name_=(str: String) { println("set name " + str) } val m = new Foo() m.name = "Foo" //等价于: m.name_=("Foo")
3.5 定义部分应用函数(partially applied function)
我们可以为某个函数只提供部分参数进行调用,返回的结果是一个新的函数,即部分应用函数。因为只提供了部分参数,所以部分应用函数也因此而得名。def sum(a: Int, b: Int, c: Int) = a + b + c val b = sum(1, _: Int, 3) b: Int => Int = <function1> b(2) //6
3.6 将方法转换成函数
Scala中方法和函数是两个不同的概念,方法无法作为参数进行传递,也无法赋值给变量,但是函数是可以的。在Scala中,利用下划线可以将方法转换成函数://将println方法转换成函数,并赋值给p val p = println _ //p: (Any) => Unit
4. 小结
下划线在大部分的应用场景中是以语法糖的形式出现的,可以减少击键次数,并且代码显得更加简洁。
相关文章推荐
- Scala基础 - 下划线使用指南
- Python中单/双下划线使用 分类: python python基础学习 2013-09-02 21:31 1764人阅读 评论(0) 收藏
- C++基础知识 --- GDB使用指南
- Scala基础编程指南
- Scala基础教程--1 使用sbt创建scala项目
- 零基础写python爬虫之urllib2使用指南
- Google AJAX Libraries API基础与使用指南
- 第十章 Scala 容器基础(十):使用for循环来遍历一个集合
- 第十章 Scala 容器基础(十三):使用for yield转化集合
- 第十章 Scala 容器基础(十五):使用flatten方法来展开一个元素为集合的集合
- 第十章 Scala 容器基础(十七):使用filter方法过滤集合元素
- 第十章 Scala 容器基础(二十):使用reduce和fold方法遍历集合的所有元素
- 第十章 Scala 容器基础(二十三):使用zip合并两个集合为二元组集合
- Spark快速入门指南 – Spark安装与基础使用
- 零基础写python爬虫之urllib2使用指南
- Scala学习笔记--正则表达式基础知识、如何在scala内使用
- 第十章 Scala 容器基础(十二):使用Iterators
- 零基础写python爬虫之urllib2使用指南
- 第十章 Scala 容器基础(九):使用foreach来遍历一个集合
- Play 2.0 用户指南 - 使用缓存 -- 针对Scala开发者