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 = [email protected]

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。
时间: 2024-10-22 13:31:27

scala命令的相关文章

Scala Control Structures

Scala之Control Structures 一.前言 前面学习了Scala的Numbers,接着学习Scala的Control Structures(控制结构). 二.Control Structures Scala中的控制结构与Java中的颇为类似,但也有所不同,例如,if/then/else控制结构与Java的类似,但是其可以返回值,虽然Java中有三元运算符的特殊语法,但是在Scala中使用if就可以达到同样的效果. val x = if (a) y else z 同样,Scala的

Scala快速概览

IDEA工具安装及scala基本操作 目录 一.         安装Scala. 3 1.       确保Java安装成功... 3 2.       解压scala-2.10.4.tgz. 3 3.       配置Scala环境变量... 3 4.       启动Scala命令行... 3 二.         Windows下安装IDEA的Scala插件... 3 1.       在IDEA中File打开Setting. 3 2.       安装Scala插件... 4 3.  

jdb调试scala代码的简单介绍

在linux调试C/C++的代码需要通过gdb,调试java代码呢?那就需要用到jdb工具了.关于jdb的用法在网上大家都可以找到相应的文章,但是对scala进行调试的就比较少了.其实调试的大致流程都是一样的,只是需要注意一些细节的地方就可以了.下面就来简单说明一下.在这里关于scala和jdk的配置问题就不再详述了,下面进入正题吧. 首先放上调试用的scala代码hello.scala object hello { def main(args: Array[String]): Unit = {

scala学习

学习资料一,做的比较炫酷的文档,看着很舒服 http://zh.scala-tour.com/#/funtional-contents 下面是一个为java程序员编写的scala入门教程,内容不多但是可以用来快速了解scala吧 原帖地址:http://dataunion.org/14967.html,这篇文章是英文原稿的翻译,google上还有中英文对照稿,有兴趣的也可以看下: 本文是<A Scala Tutorial for Java programmers>英文的翻译,英文版地址A Sc

scala目录

1. 使用Scala(构建这样一个应用,它会取回一份列表,其中包括用户持有的股票的代码以及股份,并告知他们在当前日期为止的这些投资的总价.这包含了几件事:获取用户输入.读文件.解析数据.写文件.从Web获取数据.把信息显示给用户.) 2. 与Java互操作 3. Scala并发编程 4. scala的一些特殊用法 5. 把Scala代码当作脚本运行 6. scala编程第15章 7. scala编程第16章学习笔记(1) 8. scala编程第16章学习笔记(2) 9. scala编程第16章学

DT大数据梦工厂-Scala学习笔记(1):Scala开发环境搭建和HelloWorld解析

一.scala是函数式编程和面向对象编程结合的语言,这两种编程的特点分别是什么? 答:函数式编程擅长数值的计算:面向对象编程特别适合于大型工程或项目的组织,以及团队的分工协作. 二.Scala的特点 Scala结构优雅.计算精致.富有表现力 三.scala的安装需要什么资源? Java,推荐安装Java8(Java7也可以) 支持scala 2.10.*以上(可以安装2.10.4,http://scala-lang.org/download) 四.设置环境变量(系统变量): (1)JAVA_HO

【Scala】Scala之Control Structures

一.前言 前面学习了Scala的Numbers,接着学习Scala的Control Structures(控制结构). 二.Control Structures Scala中的控制结构与Java中的颇为类似,但也有所不同,例如,if/then/else控制结构与Java的类似,但是其可以返回值,虽然Java中有三元运算符的特殊语法,但是在Scala中使用if就可以达到同样的效果. val x = if (a) y else z 同样,Scala的try/catch/finally 结构与Java

Scala编程基础

Scala与Java的关系... 1 安装Scala. 1 Scala解释器的使用... 2 声明变量... 2 数据类型与操作符... 2 函数调用与apply()函数... 3 if表达式... 3 语句终结符.块表达式... 4 输入和输出... 4 循环... 4 高级for循环... 5 函数的定义与调用... 5 在代码块中定义包含多行语句的函数体... 5 递归函数与返回类型... 6 默认参数... 6 函数调用时带名参数... 6 变长参数... 6 序列作为变长参数... 6

安装scala

Linux中安装scala 1.首先确保你本地以及安装了 JDK 1.5 以上版本,并且设置了 JAVA_HOME 环境变量及 JDK 的bin目录. C:\Users\xiong>java -version java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed