scala学习手记5 - 元组与多重赋值
假定要在一个方法中返回多个值。比如需要返回一个人的名、姓和邮箱地址。在Java中最常用的方法是定义一个Person类,其中包括相对应的字段;还有些不常用的方法就是返回一个集合或数组,拿到结果后再进行循环取值。在Scala中我们又多一个选择:元组。
元组是一个不可变的对象序列,可以使用逗号分隔的值进行创建,比如这个有3个对象的元组:(“robin”, “zhang”, “robin@zhyea.com”)。
元组的一个特性就是多重赋值,就是可以将元组中的元素赋值给多个val或var。
下面是一个例子:
def getPersonInfo (primaryKey: Int) = {
//假设使用primaryKey获取用户信息
//这里的返回值被硬编码了
("robin", "zhang", "robin@zhyea.com")
}
val (firstName, lastName, email) = getPersonInfo (1);
println ("firstName: " + firstName)
println ("lastName: " + lastName)
println ("email: " + email)
再来看一下执行结果:

多重赋值成功了。注释中的“硬编码”是什么意思在百度后知道了:硬编码是指将可变变量用一个固定值来代替的方法。还有一点就是getPersonInfo方法中返回结果没有使用return,这也是scala支持的一个特性:在scala中的方法中将最后出现的变量作为return的值。要使用return必须显示指定返回类型,从而使scala失去推断返回值类型的能力。必须使用return意味着存在“多路径返回”的问题,需要借助return的中断返回的特性来处理多分支问题。在scala中不鼓励使用return。
如果尝试将方法返回结果赋值给数量不一致的变量scala就会报错,如果是在编译代码而不是作为脚本执行,那么在编译期间就会报错。
将代码调整成这样:
def getPersonInfo (primaryKey: Int) = {
//假设使用primaryKey获取用户信息
//这里的返回值被硬编码了
("robin", "zhang", "robin@zhyea.com")
}
val (firstName, lastName) = getPersonInfo (1);
println ("firstName: " + firstName)
println ("lastName: " + lastName)
执行后报错了:

不赋值的话也可以使用索引来访问元组中的元素,像这样:
val info = getPersonInfo (1);
println ("firstName: " + info._1)
println ("lastName: " + info._2)
println ("email: " + info._3)
元组不仅仅对多重赋值中有用。在并发编程里,使用元组可以把一组数据值作为消息在Actor之间传递(它们不变的属性刚好在这里派得上用场)。这一点先记下来。
scala的元组还有一个特性,就是元组中的值可以是不同类型。稍稍调整了下之前的代码:
def getPersonInfo (primaryKey: Int) = {
//假设使用primaryKey获取用户信息
//这里的返回值被硬编码了
("robin", "zhang", 29, "robin@zhyea.com")
}
val info = getPersonInfo (1);
println ("firstName: " + info._1)
println ("lastName: " + info._2)
println ("age: " + info._3)
println ("email: " + info._4)
再来看一下执行结果:

就这样。
scala学习手记5 - 元组与多重赋值的更多相关文章
- scala学习手记17 - 容器和类型推断
关于scala的类型推断前面已经提到过多次.再来看一下下面这个例子: import java.util._ var list1: List[Int] = new ArrayList[Int] var ...
- Scala学习手记1 - 快速体验
又重新开始了scala的学习,因为中断了太长时间,所以这次还得从零开始.学习的过程就记录在这个博客上了. 这次学习的教程是<scala程序设计 java虚拟机多核编程实战>,我在多看上买了 ...
- scala 学习笔记(02) 元组Tuple、数组Array、Map、文件读写、网页抓取示例
package yjmyzz import java.io.PrintWriter import java.util.Date import scala.io.Source object ScalaA ...
- Scala学习——数组/映射/元组
[<快学Scala>笔记] 数组 / 映射 / 元组 一.数组 1.定长数组 声明数组的两种形式: 声明指定长度的数组 val 数组名= new Array[类型](数组长度) 提供数组初 ...
- scala学习手记39 - 模式匹配
在java中有switch/case这样的模式匹配语句,可以匹配的类型包括int,byte,char,short, enum,在java8又支持了字符串. 在scala中也有类似的模式匹配语句,即ma ...
- scala学习手记38 - 方法命名约定和for表达式
方法命名约定 之前在学习<运算符重载>一节时曾经说过一个方法命名约定:方法的第一个字符决定了方法的优先级.现在再说另一个命名约定:如果方法以冒号(:)结尾,则调用目标是运算符后面的实例. ...
- scala学习手记34 - trait方法的延迟绑定
trait的方法的延迟绑定就是先混入的trait的方法会后调用.这一点从上一节的实例中也可以看出来. 下面再来看一个类似的例子: abstract class Writer { def write(m ...
- scala学习手记23 - 函数值
scala的一个最主要的特性就是支持函数编程.函数是函数编程中的一等公民:函数可以作为参数传递给其他函数,可以作为其他函数的返回值,甚至可以在其它函数中嵌套.这些高阶函数称为函数值. 举一个简单的例子 ...
- scala学习手记22 - 参数化类型的可变性
java 的代码中多少有些不是很严谨的内容,比如下面的这段代码: public class Trouble { public static void main(String[] args) { Int ...
随机推荐
- Less-@import 导入选项
//@import 导入选项 --@import 可以至于任何你需要导入的地方 在标准的CSS,@import在规则必须先于所有其他类型的规则.但Less.js不关心 example: .test() ...
- 【Trello】使用指南
一.谷歌浏览器插件推荐: Card Color Titles for Trello 在Card上现实标签的标题文字 Trellists: Trello Lists Master 允许展示和隐藏List ...
- Java 其他对象的 API
System 类 (java.lang 包下) 该类中的方法和属性都是静态的. 常见方法 // 1, 获取当前时间的毫秒值 long currentTimeMillis(); // 2, 获取系统的属 ...
- SQL Server中行列转换 Pivot UnPivot
PIVOT用于将列值旋转为列名(即行转列),在SQLServer 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列)FOR 列 in (-) )AS P 完 ...
- 洛谷 P4451 [国家集训队]整数的lqp拆分
洛谷 这个题目是黑题,本来想打表的,但是表调不出来(我逊毙了)! 然后随便打了一个递推,凑出了样例, 竟然. 竟然.. 竟然... A了!!!!!!! 直接:\(f[i]=f[i-1]*2+f[i-2 ...
- 001-spring结合quartz使用
一.添加pom 二.定义业务类 public class TestJobTask{ /** *业务逻辑处理 */ public void service(){ /**业务逻辑*/ .. } } 二.配 ...
- PyNest——part 4: topologically structured networks
part 4: topologically structured networks incorporating structure in networks of point neurons 如果我们使 ...
- Linux学习笔记—Linux磁盘与文件系统管理(转载)
认识EXT2文件系统 文件的系统特性 Linux的正规文件系统为Ext2 文件数据除了文件实际内容外,还包括其他属性(文件权限.文件属性). 文件系统将这两部分数据分别存放在不同的块,权限和属性放在i ...
- Jquery 实现跨域处理
JS部分代码: $.ajax({ url:url, dataType:'jsonp', data:{title:title}, jsonp:'callback', success:function(l ...
- java项目地址和服务器地址区分
项目地址String filePath = request.getSession().getServletContext().getRealPath("/") + "up ...