Scala--控制结构和函数
一、条件表达式
val s = if(x > 1) 1 else -1
s 可以是 val
var s = 0
if(x > 1) s = 1 else s = -1
s 必须是 var
表达式 val s = if(x > 1) 1 else -1的类型是Int
混合类型表达式
if(x > 1) "hello" else -1
一个是String,一个是Int,公共超类型是Any。
if(x > 1) 1 或 if(x > 1) 1 else ()
()表示Unit, "无有用值", 当做java中的void.
java、c中的三目运算符 m>1 ? 1 : -1
scala 没有,而是使用条件表达式来代替
val s = if(m>1) 1 else -1
二、语句终止
每条语句,行尾不需要使用分号,如果在单行中写下多个语句,就需要将他们分号隔开。
if (n > 0) {r = r*n; n -= 1}
在写较长的语句,分两行来写的话,第一行不能用表示结尾的符号结尾,比如操作符+; repl模式不支持 (read evaluate print loop)
s = s0 + s1 * s2 +
s3 * 0.5 + s4
推荐使用花括号
if( n > 1) {
r = r * n
n -= 1
}
三、块表达式和赋值
val dis: Int = { val a = 2; val b = 4; a+b}
println(dis)
语句块的返回值取最后一个表达式,这里为 a+b的结果。
val n: Unit = { val a = 3}
println(n)
赋值语句的返回值是Unit类型类似于java中的void,结果为()
注 不要这样赋值
y = x = 1
x = 1的结果为Unit,则y的值为Unit
四、输入和输出
输出:
print("Answer:")
println( 42 )
println("Answer:" + 42)
//格式化输出使用printf
printf("My name is %s, I am %d years old.\n", "Fred", 42 )
格式化输出使用printf
换行输出println
输入:
val name = readLine("You name:")
print("Your age:")
val age = readInt()
printf("Hello %s, next year, you will be %d years old.\n", name, age + 1)
readLine读取一行,带参数提示符。
readInt, readChar, readFloat, readDouble, readByte, readShort, readBoolean, readLong
println(s"")
val str = "world"
println(s"hello $str")
println(s"1+1=${1+1}")
hello world
1+1=2
println(f"")
val w = 1.2d
println(f"you weight is $w%.2f")
you weight is 1.20
println(raw"")
println(raw"hello \n")
hello \n
五、循环
while循环
while(n > 0){
n = n*r
n -= 1
}
for循环 变量 i 在之前并不需要指定
for(i <- 1 to 10){
println(i)
}
until 返回一个并不包含上线的区间,最后一个值为 s.length-1
val s = "hello"
for(i <- 0 until s.length) {
println(s(i))
}
scala没有与java for(;;)循环相关的结构
scala没有提供continue和break语句来退出循环,如果需要break时,我们该如何操作?
- 使用Breaks对象中的break方法,breakable是函数
import scala.util.control.Breaks._
breakable{
for(i<- 0 to 10){
if(i == 4){
break
}
println(i)
}
}
- 使用嵌套函数,在函数中调用return
def func(): Unit ={
for(i<- 0 to 10){
if(i == 4){
return
}
println(i)
}
}
func()
- 使用boolean型的控制变量
for(i<- 0 to 10 if i < 4){
println(i)
}
六、高级for循环和for推导式
变量<-表达式 表示生成器
提供多个生成器
for(i<- 1 to 3; j<- 1 to 3) print ( i*10 +j +" ")
结果:11 12 13 21 22 23 31 32 33
类似于Java的嵌套for循环
每个生成器可以带一个守卫 以if开头的Boolean的表达式
for(i<- 1 to 3; j<- 1 to 3 if i != j) print ( i*10 +j +" ")
结果:12 13 21 23 31 32
定义任意多的变量,在循环中使用
for(i<- 1 to 3; from<- 4 to i; j<- from to 3) print ( i*10 +j +" ")
结果:12 13 21 23 31 32
推导式 for的循环体以yield开始,循环会构造出一个集合,每次迭代生成集合的一个值
for(i<- 1 to 10) yield i % 3
结果 Vector(1, 2, 0, 1, 2, 0, 1, 2, 0, 1)
推导生成的集合与它的第一个生成器是类型兼容的
for(c<- "Hello"; i<- 0 to 1) yield (c+i).toChar //第一个生成器是 c<-"Hello"
for(i<- 0 to 1;c<- "Hello") yield (c+i).toChar //第一个生成器是 i<- 0 to 1
结果:HIeflmlmop
Vector(H, e, l, l, o, I, f, m, m, p)
七、函数
方法是对对象的操作
= 右边是函数块
def abs(x: Double) = if (x > 0) x else -x
函数可以不指定返回值类型,除非是递归函数。函数中的最后一个表达式的值即为函数的返回值。
对于递归函数,我们必须指定返回类型 = 左边是返回值类型
def fac(n: Int): Int = if (n <= 0) 1 else n * fac(n - 1)
八、默认参数和带名参数
def decorate(str:String, left:String="[", right:String="]") = left + str + right
println(decorate("hello")) //默认参数
println(decorate("hello","(",")")) //指定全部参数
println(decorate(left="<",str="hello",right=">")) //带名参数
结果:[hello]
(hello)
<hello>
九、变长参数
* 变长参数
def sum(args: Int*) = {
var result = 0
for(arg <- args) result += arg
result
}
println(sum(1,2,3,4,5,6,7,8,9))//
println(sum(1 to 9 : _*)) //当做参数序列处理,使用 :_*
println(sum(1 to 9) //错误,传递整个区间
十、过程
过程不返回值
def box(s:String){ //注意 没有 =
val border = "-"*s.length+"--\n"
println(border+"|"+s+"|\n"+border)
}
box("hello")
十一、懒值
当val被声明为lazy时,他的初始化将被推迟,直到我们首次对他取值
lazy val l = {println("I am lazy");1}
println("this is ok")
val v = l
结果:this is ok
I am lazy
十二、异常

1.
val signum = if(a > 0) 1 else if(a==0) 0 else -1
2.
空 Unit
3.
Unit
4.
for(i<- 0 to 10 ;j=10-i) println(j)
5.
def countdown(n:Int) {
for(i<- 0 to n; j=n-i) println(j)
}
6.
val str = "Hello"
var sum:Long = 0
for(i<-str) sum=sum* i.toLong
7.
val str = "Hello"
val r = (1L/:str)(_.toLong*_.toLong)
8.
def product(s:String):Long={
(1L/:str)(_.toLong * _.toLong)
}
9.
def recproduct(str:String):Long = {
if (str.length == 0) 1
else str(0).toLong * recproduct(str.drop(1))
}
10.
def computex(x:Long, n:Int) :Long={
if(n==0) 1
else if(n%2==0) computex(x,n/2)*computex(x,n/2)
else if(n%2==1) x * computex(x, n-1)
else computex(x,-n)
}
println(computex(2,3))
println(computex(4,4))
参考《快学Scala》
Scala--控制结构和函数的更多相关文章
- 2.scala控制结构、函数、异常处理
2.scala控制结构.函数.异常处理---小书匠,在线编辑器,MARKDOWN,Evernote,文件版本 a:focus { outline: thin dotted #333; outline: ...
- Scala学习(二)--- 控制结构和函数
控制结构和函数 摘要: 本篇主要学习在Scala中使用条件表达式.循环和函数,你会看到Scala和其他编程语言之间一个根本性的差异.在Java或C++中,我们把表达式(比如3+4)和语句(比如if语句 ...
- Scala的控制结构和函数
控制结构和函数 先看以下简单的一个条件表达式的demo object TestConditional { def main(args: Array[String]): Unit = { // scal ...
- Scala具体解释---------控制结构和函数
条件表达式: Scala的if else语法结构和Java的一样.只是,Scala的if else表达式有值.这个值就是跟在if或者else后面的表达式的值. 比如: if(x>0) 0 els ...
- Scala 深入浅出实战经典 第42讲:scala 泛型类,泛型函数,泛型在spark中的广泛应用
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Scala 控制结构
Scala内建的控制结构屈指可数,仅有if, while, for, match, try和函数调用而已. 几乎所有的Scala控制结构都会产生某个值(while和 do while虽然不能产生有意义 ...
- 【Scala篇】--Scala中的函数
一.前述 Scala中的函数还是比较重要的,所以本文章把Scala中可能用到的函数列举如下,并做详细说明. 二.具体函数 1.Scala函数的定义 def fun (a: Int , b: Int ) ...
- Scala 方法与函数
Scala 方法与函数:http://www.runoob.com/scala/scala-functions.html Scala 有方法与函数,二者在语义上的区别很小.Scala 方法是类的一部分 ...
- Scala 方法和函数
package com.bigdata // /** Scala 方法和函数:Scala中既有函数也有方法,大多数情况下我们都可以不去理会他们之间的区别. * * 方法:Scala 中的方法跟 Jav ...
- Scala中的函数
Scala中的函数 提纲 1.Scala中的函数简介 2.Scala中的函数的各种写法 1.Scala中的函数简介 =================== Scala是函数式编程和面向对象式编程的混合 ...
随机推荐
- 一道编程题: 在1~n之间选择若干个数,使其和为m
这是一道很明显的动态规划的题目. 递推公式为 用sum(n, m)表示所有可能的1~n之间存在的和为m的组合 那么 sum(n,m) = sum(n-1, m) | sum(n-1, m-n) 直接上 ...
- 最短路问题之Bellman-ford算法
题目: 最短路:给定两个顶点,在以这两个点为起点和终点的路径中,边的权值和最小的路径.考虑权值为点之间的距离. 单源最短路问题,Bellman-ford算法 思路:每次循环检查所有边,可优化. 应用于 ...
- Android框架式编程之RxJava(一):HelloWorld
Hello World 源码: import android.graphics.Bitmap; import android.graphics.BitmapFactory; import androi ...
- [Inside HotSpot] C1编译器工作流程及中间表示
1. C1编译器线程 C1编译器(aka Client Compiler)的代码位于hotspot\share\c1.C1编译线程(C1 CompilerThread)会阻塞在任务队列,当发现队列有编 ...
- Scanner对象及其获取数据出现小问题和解决方案
Scanner类简介: Java 5添加了java.util.Scanner类,我们可以通过Scanner类来获取用户输入.它是以前的StringTokenizer和Matcher类之间的某种结合.由 ...
- 从壹开始微服务 [ DDD ] 之六 ║聚合 与 聚合根 (下)
前言 哈喽大家周二好,上次咱们说到了实体与值对象的简单知识,相信大家也是稍微有些了解,其实实体咱们平时用的很多了,基本可以和数据库表进行联系,只不过值对象可能不是很熟悉,值对象简单来说就是在DDD领域 ...
- qs.stringify和JSON.stringify的使用和区别
qs可通过npm install qs命令进行安装,是一个npm仓库所管理的包. 而qs.stringify()将对象 序列化成URL的形式,以&进行拼接. JSON是正常类型的JSON,请对 ...
- Windows10下安装Docker的步骤
一.启用Hyper-V 打开控制面板 - 程序和功能 - 启用或关闭Windows功能,勾选Hyper-V,然后点击确定即可,如图: 点击确定后,启用完毕会提示重启系统,我们可以稍后再重启. 二.安装 ...
- Neo4j入门之中国电影票房排行浅析
什么是Neo4j? Neo4j是一个高性能的NoSQL图形数据库(Graph Database),它将结构化数据存储在网络上而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持 ...
- C#工具:汉字转拼音帮助类
using System.Text; namespace Core.Common { /// <summary> /// 取汉字拼音的首字母 /// </summary> pu ...