scala命令
1. intersect方法找出两个字符串的相同字符:
scala> "Hello".intersect("World")
res3: String = lo
2. for推导式生成的集合与它的第一个生成器的类型是兼容的。
scala> for(c <- "Hello";i <- 0 to 1) yield (c + i).toChar
res7: String = HIeflmlmop scala> for(i <- 0 to 1; c <- "Hello") yield (c + i).toChar
res9: scala.collection.immutable.IndexedSeq[Char] = Vector(H, e, l, l, o, I, f,
m, m, p)
3. 变长参数
scala> def sum(args: Int*) = {
| var result = 0
| for (arg <- args) result += arg
| result
| }
sum: (args: Int*)Int
scala> val s = sum(1, 3, 4, 5, 32)
s: Int = 45
scala> def recursiveSum(args: Int*): Int = {
| if(args.length == 0) 0
| else args.head + recursiveSum(args.tail: _*)
| }
recursiveSum: (args: Int*)Int
scala> recursiveSum(1 to 5: _*)
res10: Int = 15
在这里,序列的head是它的首个元素,而tail是所有其他元素的序列,这又是一个Seq,我们用:_*来将它转换成参数序列。
4. 过程
Scala对于不返回值的函数有特殊的表示法。如果函数体包含在花括号当中但没有前面的=号,那么返回值类型就是Unit。这样的函数被称做过程(procedure)。过程不返回值,我们调用它仅仅是为了它的副作用。例如:
scala> def box(s: String) {
| var border = "-" * s.length + "--\n"
| println(border + "|" + s + "|\n" + border)
| }
box: (s: String)Unit
scala> box("Hello")
-------
|Hello|
-------
5. 变长数组:数组缓冲
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer scala> val b = ArrayBuffer[Int]()
b: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer() scala> b += 1
res15: b.type = ArrayBuffer(1) scala> b += (1, 2, 3, 5)
res16: b.type = ArrayBuffer(1, 1, 2, 3, 5) scala> b ++= Array(8, 13, 21)
res17: b.type = ArrayBuffer(1, 1, 2, 3, 5, 8, 13, 21)
scala> b.trimEnd(5) //移除最后5个元素
scala> b
res19: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 1, 2)
你也可以在任意位置插入或移除元素,但这样的操作并不那么高效——所有在那个位置之后的元素都必须被平移。举例如下:
scala> b.insert(2,6) //在下标2之前插入 scala> b
res21: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 1, 6, 2) scala> b.insert(2,7,8,9) //可以插入任意多的元素 scala> b
res23: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 1, 7, 8, 9, 6,
2) scala> b.remove(2)
res24: Int = 7 scala> b
res25: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 1, 8, 9, 6, 2) scala> b.remove(2,3) //第2个参数的含义是要移除多少个元素 scala> b
res27: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 1, 2)
有时候你需要构建一个Array,但不知道最终需要装多少元素。这种情况下,先构建一个数组缓冲,然后调用:
scala> b.toArray
res28: Array[Int] = Array(1, 1, 2)
反过来,调用a.toBuffer可以将一个数组a转换成一个数组缓冲。
6. 数组转换
从一个数组(或数组缓冲)出发,以某种方式对它进行转换是很简单的。这些转换动作不会修改原始数组,而是产生一个全新的数组。
像这样使用for推导式:
scala> val a = Array(2, 3, 5, 7, 11)
a: Array[Int] = Array(2, 3, 5, 7, 11) scala> val result = for(elem <- a) yield 2*elem
result: Array[Int] = Array(4, 6, 10, 14, 22)
for(...)yield循环创建了一个类型与原始集合相同的新集合。如果你从数组出发,那么你得到的是另一个数组。如果你从数组缓冲出发,那么你在for(...)yield之后得到的也是一个数组缓冲。
另一种做法是:
scala> a.filter(_ % 2 == 0).map(2 * _)
res34: Array[Int] = Array(4) scala> a.filter(_ % 2 == 0) map(2 * _)
res35: Array[Int] = Array(4)
7. 多维数组
和java一样,多维数组是通过数组来实现的。举例来说,Double的二维数组类型为Array[Array[Double]]。要构建这样一个数组,可以用ofDim方法:
scala> val matrix = Array.ofDim[Double](3, 4) //三行,四列
matrix: Array[Array[Double]] = Array(Array(0.0, 0.0, 0.0, 0.0), Array(0.0, 0.0,0.0, 0.0), Array(0.0, 0.0, 0.0, 0.0))
要访问其中的元素,使用两对圆括号:
scala> matrix(0)(0) = 42 scala> matrix
res2: Array[Array[Double]] = Array(Array(42.0, 0.0, 0.0, 0.0), Array(0.0, 0.0, 0.0, 0.0), Array(0.0, 0.0, 0.0, 0.0))
你可以创建不规则的数组,每一行的长度各不相同:
scala> val triangle = new Array[Array[Int]](10)
triangle: Array[Array[Int]] = Array(null, null, null, null, null, null, null, null, null, null) scala> for(i <- 0 until triangle.length)
| triangle(i) = new Array[Int](i + 1) scala> triangle
res4: Array[Array[Int]] = Array(Array(0), Array(0, 0), Array(0, 0, 0), Array(0, 0, 0, 0), Array(0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0))
8. 与Java的互操作
由于Scala数组是用Java数组实现的,你可以在Java和Scala之间来回传递。可以引入scala.collection.JavaConversions里的隐式转换方法。这样你就可以在代码中使用Scala缓冲,在调用Java方法时,这些对象会被自动包装成Java列表。
举例来说,java.lang.ProcessBuilder类有一个以List<Sring>为参数的构造器。以下是在scala中调用它的写法:
scala> import scala.collection.JavaConversions.bufferAsJavaList
import scala.collection.JavaConversions.bufferAsJavaList scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer scala> val command = ArrayBuffer("ls","-al","/home/cay")
command: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer(ls, -al, /home/cay) scala> val pb = new ProcessBuilder(command) //Scala到Java的转换
pb: ProcessBuilder = java.lang.ProcessBuilder@b37537
Scala缓冲被包装成了一个实现了java.util.List接口的Java类的对象。
反过来讲,当Java方法返回java.util.List时,我们可以让它自动转换成一个Buffer:
scala> import scala.collection.JavaConversions.asScalaBuffer
import scala.collection.JavaConversions.asScalaBuffer scala> import scala.collection.mutable.Buffer
import scala.collection.mutable.Buffer scala> val cmd: Buffer[String] = pb.command() //Java到Scala的转换
cmd: scala.collection.mutable.Buffer[String] = ArrayBuffer(ls, -al, /home/cay)
//不能使用ArrayBuffer——包装起来的对象仅能保证是个Buffer
如果Java方法返回一个包装过的Scala缓冲,那么隐式转换会将原始的对象解包出来。拿本例来说,cmd == command。
9. 获取映射中的值
scala> val scores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)
scores: scala.collection.immutable.Map[String,Int] = Map(Alice -> 10, Bob -> 3,
Cindy -> 8)
scala> val scores = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 3, "Can
dy" -> 8)
scores: scala.collection.mutable.Map[String,Int] = Map(Bob -> 3, Alice -> 10, Ca
ndy -> 8)
scala> val scores = new scala.collection.mutable.HashMap[String,Int]
scores: scala.collection.mutable.HashMap[String,Int] = Map()
scala> "Alice" -> 10
res5: (String, Int) = (Alice,10)
scala> scores
res6: scala.collection.mutable.HashMap[String,Int] = Map()
scala> val scores = Map(("Alice", 10), ("Bob", 3), ("Cindy", 8)
| )
scores: scala.collection.immutable.Map[String,Int] = Map(Alice -> 10, Bob -> 3,
Cindy -> 8)
scala> val bobsScore = scores("Bob")
bobsScore: Int = 3
scala> val bobsScore = if(scores.contains("Bob")) scores("Bob") else 0
bobsScore: Int = 3
由于这样的组合调用十分普遍,以下是一个快捷的写法:
scala> val bobsScore = scores.getOrElse("Bob", 0)
bobsScore: Int = 3
//如果映射包含键“Bob”,返回对应的值;否则,返回0。
scala命令的更多相关文章
- Scala命令设置JVM参数的规则
Scala下设置JVM参数简单分析 Scala 启动shell脚本,简化后的scala REPL 启动命令大致如下所示: java -Xmx256M -Xms32M \-Xbootclasspath/ ...
- 在scala命令行中加入类库
在scala命令行中加入scala的类库. scala -toolcp $HOME/.ivy2/cache/org.scalanlp/breeze_2.12/jars/breeze_2.12-0.13 ...
- spark与Scala安装过程和步骤及sparkshell命令的使用
Spark与Scala版本兼容问题: Spark运行在Java 8 +,Python 2.7 + / 3.4 +和R 3.1+上.对于Scala API,Spark 2.4.2使用Scala 2.12 ...
- scala文件通过本地命令运行
1.准备(检查) a.本地环境安装jdk b.安装scala 2.sublime编辑scala文件,并存放到F:\plan_next\scala_compile下 3.文件目录中切换到cmd中(文件目 ...
- jdb调试scala代码的简单介绍
在linux调试C/C++的代码需要通过gdb,调试java代码呢?那就需要用到jdb工具了.关于jdb的用法在网上大家都可以找到相应的文章,但是对scala进行调试的就比较少了.其实调试的大致流程都 ...
- Scala快速概览
IDEA工具安装及scala基本操作 目录 一. 1. 2. 3. 4. 二. 1. 2. 3. 三. 1. 2. 3. 4. 5. 6. 7. 四. 1. (1) (2) (3) (4) (5) ( ...
- Scala HandBook
目录[-] 1. Scala有多cool 1.1. 速度! 1.2. 易用的数据结构 1.3. OOP+FP 1.4. 动态+静态 1.5. DSL 1.6 ...
- Scala 编程---类和对象
类是对象的蓝图.一旦你定义了类,你就可以用关键字new从类的蓝图里创建对象.比方说,如果给出了类的定义: class ChecksumAccumulator { // class definition ...
- Mac 配置Spark环境scala+python版本(Spark1.6.0)
1. 从官网下载Spark安装包,解压到自己的安装目录下(默认已经安装好JDK,JDK安装可自行查找): spark官网:http://spark.apache.org/downloads.html ...
随机推荐
- 【c_prime_plus】第十七章笔记
抽象数据类型(ADT) 为类型的属性和可对类型执行的操作提供一个抽象的描述,这个米阿叔不受任何实现的约束,甚至不受任何特定编程语言的约束,这样一种正式的抽象描述被称为抽象数据类型. 开一个实现该ADT ...
- C#获取ftp文件最后修改时间
public static DateTime GetFileModifyDateTime(string ftpServerIP,string ftpFolder,string ftpUserID,st ...
- ets dets
相同点:ets和dets都提供“键—值”搜索表 不同点:ets驻留在内存,dets驻留在磁盘 特点:ets表和dets表可以被多个进程共享,因此通过这两个模块可以实现数据间的交换 一 ets表 实现 ...
- error while loading shared libraries: lib******: cannot open shared object file: No such file or directory
程序编译成功后,运行时错误: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object fi ...
- Hadoop HDFS概念学习系列之分布式文件管理系统(二十五)
数据量越来越多,在一个操作系统管辖的范围存在不了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来 管理多台机器上的文件,这就是分布式文件管理系统. 是一种允许文件 ...
- 关于文章“cocos2dx移植android平台-我的血泪史”需要注意事项
关于文章"cocos2dx移植android平台-我的血泪史"需要注意事项 在上次转载的这篇文章中,按照配置一步一步的下去.发现工程中在Android.mk中有一处错误.直接bui ...
- SQL获取变量类型以及变量最大长度
DECLARE @Temp nvarchar(1050)='' SELECT CAST(SQL_VARIANT_PROPERTY(@Temp, 'BaseType') AS VARCHAR(50))S ...
- 常见mongo命令
@(编程) 查询 db.getCollection('SalaryEntity').find({"Month" : "201601"}) db.getColle ...
- maven 部署到tomcat 的 resource问题
1.maven resource结构 如图,我将resoures下建立四个子文件夹,base存放的是不随环境变化的配置项,而其他三个均是对应环境的配置文件. 2.问题 我执行maven命令是没有的,但 ...
- SSH下载的方法2
------------------------------下作下载方法二---------------------------------------------------String msg=n ...