Scala编程脚本.01

一、Scala与Java的关系

Scala是基于Java虚拟机,也就是JVM的一门编程语言。所有Scala的代码,都需要经过编译为字节码,然后交由Java虚拟机来运行。所以Scala和Java是可以无缝互操作的。
Scala可以任意调用Java的代码。所以Scala与Java的关系是非常非常紧密的。

1.Scala解释器的使用:
REPL(解释器):Read(取值) 、Evaluation(求值)、Print(打印)、Loop(循环)。快速编译scala代码为字节码,然后交给JVM来执行。
计算表达式:在scala>命令行内,键入scala代码,解释器会直接返回结果。如果没有指定的变量来存放这个值,那么默认的名称为res,并且会显示结果的数据类型,如:lnt、Double、String等。如图:
在这里插入图片描述
2.声明val变量:
val变量来存放表达式的计算结果,但是常量声明后,是无法改变它的值,例如,result = 1,会返回error: reassignment to val的错误信息。
例如,val result = 1 + 1如图:

在这里插入图片描述
3.声明var变量:
使用var变量声明值可以改变。
例如,var myresult = 1,myresult = 2如图:
在这里插入图片描述
但是在scala程序中,通常建议使用val,也就是常量,因此比如类似于spark的大型复杂系统中,需要大量的网络传输数据,如果使用var,可能会担心值被错误的更改。
在Java的大型复杂系统的设计和开发中,也使用了类似的特性,我们通常会将传递给其他模块 / 组件 / 服务的对象,设计成不可变类(Immutable Class)。在里面也会使用java的常量定义,比如final,阻止变量的值被改变。从而提高系统的健壮性(robust,鲁棒性),和安全性。

4.基本数据类型:
Byte、Char、Short、Int、Long、Float、Double、Boolean。cala没有基本数据类型与包装类型的概念,统一都是类,所以scala自己会负责基本数据类型和引用类型的转换操作。
使用以上类型,直接就可以调用大量的函数,例如,1.toString(),1.to(10)如图:
在这里插入图片描述
5.函数调用方式:
在scala中,函数调用也很简单。
·例如,import scala.math._,sqrt(2),pow(2, 4),min(3, Pi)。

不同的一点是,如果调用函数时,不需要传递参数,则scala允许调用函数时省略括号的,
例如,“Hello World”.distinct
在这里插入图片描述
6.apply函数:
Scala中的apply函数是非常特殊的一种函数,在Scala的object中,可以声明apply函数。而使用“类名()”的形式,其实就是“类名.apply()”的一种缩写。通常使用这种方式来构造类的对象,而不是使用“new 类名()”的方式。

7.if表达式的定义:
在Scala中,if表达式是有值的,就是if或者else中最后一行语句返回的值。
例如,val age = 30; if (age > 18) 1 else 0
在这里插入图片描述
例如,val isAdult = if (age > 18) 1 else 0
在这里插入图片描述
8.if表达式的类型推断:
由于if表达式是有值的,而if和else子句的值类型可能不同,此时if表达式的值是什么类型呢?Scala会自动进行推断,取两个类型的公共父类型。
例如,if(age > 18) 1 else 0,表达式的类型是Int,因为1和0都是Int
在这里插入图片描述

例如,if(age > 18) “adult” else 0,此时if和else的值分别是String和Int,则表达式的值是Any,Any是String和Int的公共父类型。
在这里插入图片描述
如果if后面没有跟else,则默认else的值是Unit,也用()表示,类似于java中的void或者null。

例如,val age = 12; if(age > 18) “adult”。此时就相当于if(age > 18) “adult” else ()。
在这里插入图片描述
在这里插入图片描述
9.将if语句放在多行中:
默认情况下,REPL只能解释一行语句,但是if表达式通常需要放在多行。
可以使用{}的方式,比如以下方式,用:paste和ctrl+D的方式。
if(age > 18) { “adult”
} else if(age > 12) “teenager” else “children”
在这里插入图片描述
10.一行放多条语句:
例如,使用分号作为语句的终止符,var a, b, c = 0; if(a < 10) { b = b + 1; c = c + 1 }
还可以用花括号的方式,
if(a < 10) {
b = b + 1
c = c + 1
}
在这里插入图片描述
11.块表达式:
指的{ }中的值,其中可以包含多条语句,最后一个语句的值就是块表达式的返回值。
例如,var d = if(a < 10) { b = b + 1; c + 1 }
在这里插入图片描述
二、 print和println
print打印时不会加换行符,而println打印时会加一个换行符。
例如,print(“Hello World”);println(“Hello World”)
在这里插入图片描述
printf:printf可以用于进行格式化
例如,printf(“Hi, my name is %s, I’m %d years old.\n”, “Leo”, 30)
在这里插入图片描述
1.readLine:
readLine允许我们从控制台读取用户输入的数据,类似于java中的System.in和Scanner的作用。
综合案例:游戏厅门禁
val name = readLine("Welcome to Game House. Please tell me your name: ")
print("Thanks. Then please tell me your age: ")
val age = readInt()
if(age > 18) {
printf(“Hi, %s, you are %d years old, so you are legel to come here!”, name, age)
} else {
printf(“Sorry, boy, %s, you are only %d years old. you are illegal to come here!”, name, age)
}
在这里插入图片描述2.while do循环:
Scala有while do循环,基本语义与Java相同。
var n = 10
while(n > 0) {
println(n)
n -= 1
}
在这里插入图片描述

Scala没有for循环,只能使用while替代for循环,或者使用简易版的for语句,也可以对字符串进行遍历,类似于java的增强for循环,for(c <- “Hello World”) print©
在这里插入图片描述
三、跳出循环语句
scala没有提供类似于java的break语句。
但是可以使用boolean类型变量、return或者Breaks的break函数来替代使用。
import scala.util.control.Breaks._
breakable {
var n = 10
for(c <- “Hello World”) {
if(n == 5) break;
print©
n -= 1
}
}
在这里插入图片描述
1.if守卫:取偶数
for(i <- 1 to 100 if i % 2 == 0)println(i)
在这里插入图片描述
2.for推导式:构造集合
for(i <- 1 to 10)yield i
在这里插入图片描述
3.函数的定义与调用
Scala要求必须给出所有参数的类型,但是不一定给出函数返回值的类型,只要右侧的函数体中不包含递归的语句,Scala就可以自己根据右侧的表达式推断出返回类型。

四、在代码块中定义包含多行语句的函数体
如果函数体中有多行代码,则可以使用代码块的方式包裹多行代码,代码块中最后一行的返回值就是整个函数的返回值。与Java中不同,不是使用return返回值的。

比如如下的函数,实现累加的功能:
def sum(n: Int) = {
var sum = 0;
for(i <- 1 to n) sum += i
sum
}
在这里插入图片描述
1. 递归函数与返回类型
如果在函数体内递归调用函数自身,则必须手动给出函数的返回类型。

例如,实现经典的斐波那契数列:
9 + 8; 8 + 7 + 7 + 6; 7 + 6 + 6 + 5 + 6 + 5 + 5 + 4; …

def fab(n: Int): Int = {
if(n <= 1) 1
else fab(n - 1) + fab(n - 2)
}
在这里插入图片描述
五.默认参数
在Scala中,有时我们调用某些函数时,不希望给出参数的具体值,而希望使用参数自身默认的值,此时就定义在定义函数时使用默认参数。
**1.Java与Scala实现默认参数的区别
**
Java:

public void sayHello(String name, int age) {
if(name == null) {
name = “defaultName”
}
if(age == 0) {
age = 18
}
}
sayHello(null, 0)

Scala:
def sayHello(name: String, age: Int = 20) {
print("Hello, " + name + ", your age is " + age)
}
sayHello(“leo”)
在这里插入图片描述
2.带名参数
在调用函数时,也可以不按照函数定义的参数顺序来传递参数,而是使用带名参数的方式来传递。
还可以混合使用未命名参数和带名参数,但是未命名参数必须排在带名参数前面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值