Scala快速入门(二)

一、键盘输入

关于基本类型的运算,以及复制运算,条件运算,运算符等知识,均和Java语言一样,这里不过多叙述。

val name = StdIn.readLine()

StdIn是一个伴生对象,所以,可以直接进行使用点进行调用。

举例:

object VarDemo {
def main(args: Array[String]): Unit = {
Test.test()
}
}
object Test{
def test(): Unit ={
println("test")
}
}

​ 在这个案例中,我们知道了object伴生对象中的方法,相当于静态方法,可以直接调用,在第一节中,我们依旧可以知道,这个反编译后就是一个静态方法。

我们在源码中,可以看到,这个StdIn集成了一个StdIn实际上用了trait修饰,trait相当于Java中的Interface。请看下个例子。

object main {
def main(args: Array[String]): Unit = {
VarDemo.inter()
VarDemo.another()
}
}
object VarDemo extends Test {
def another(): Unit ={
println("another")
}
}
trait Test{
def inter(): Unit ={
println("inter")
}
}

在这个案例中,我们知道了,trait修饰的类中的方法就类似接口,伴生类继承这个接口,也可以直接用点调用中间的方法

其他从键盘读入的方法

    val a=StdIn.readLine()
val b=StdIn.readInt()
val c=StdIn.readDouble()

二、分支流程

if语句和Java完全一样

循环控制

1.for(变量<-start to end)

for(i<-1 to 3){
println(i)
}
i 从1到3,双闭区间

2.for循环的集合遍历(类似Java中的for each循环)

var list =List("1",2,3.0)
for(item<-list)
println(item)

3.for(变量<-start until end)

for(i<-1 until 3){
println(i)
}
i从1到3,左闭右开

4.for循环守卫,for循环可以加附加条件

for(i<-1 to 3 if i != 2)
println(i)

注:continue和break在scala不存在

5.for循环引入变量,通过分号可以隔开,在for循环内嵌入语句

for(i<-1 to 3 ; j=5-i)
println(j)

6.for循环返回值,将1-10保存在一个Vector并返回

val res=for(i<-1 to 10) yield i
println(res)
val res=for(i<-1 to 10) yield {
if(i % 2 == 0){
i
}else{
"不是偶数"
}
}
println(res)

7.使用Range(start,end,step)进行遍历

for(i<-Range(1,10,3)){
println(i)
}

While循环和do...while循环(不推荐使用)

语法和Java一样

科普:scala不存在break,如果我想break掉,应该怎么做?

Scala在语言设计上没有break,但是,在Break类中有一个Break.break()来进行异常退出,作者认为,break和continue不属于面向对象和函数式编程,所以在设计语法的时候,没有把这两个字加上去
举例:
var i=1
breakable(
while(true){
println(i)
i+=1
if(i==3) {
break()
}
}
)
println("break了")

三、函数式编程

什么是函数式编程,类似将一个函数本身传给一个变量。下面是函数式编程的一个小例子。

var fun=(a:Int,b:Int)=>a+b
println(fun(1,2))

1.函数的定义

def 函数名(参数名:参数类型,参数名:参数类型){

​ return 返回值

}

object o{
def main(args: Array[String]): Unit = {
println(cacu(1,2,'-'))
} def cacu(a:Int,b:Int,op:Char):Int={
if(op=='+') return a+b;//是否写return都ok
else if(op=='-') a-b;
else 0
}
}

我们如果不确定返回类型是什么,可以把:Int去掉,这样可以写成:

def cacu(a:Int,b:Int,op:Char)={
if(op=='+') a+b;//是否写return都ok
else if(op=='-') a-b;
else "op输入错误"
}

注意:在这种情况下,不能使用return

2.递归函数

递归函数,未执行之前无法推断出结果类型,所以必须明确返回值类型

3.可变参数

可变参数用*表示,加载类型的后面

案例:

def main(args: Array[String]): Unit = {
println(sum(10,20,30,40))
}
def sum(n:Int,args:Int*):Int ={
var s=n
for(item<-args){
s+=item
}
return s
}

查看下面代码是否正确

def f1="steve yu"
println(f1)

正确,定义一个函数f1,返回steve yu

4.过程函数书写

def f():Unit={
函数体
}

这个可以简写为

def f(){
函数体
}

5.惰性函数(懒加载)

函数在使用的时候进行加载

object Test {
def main(args: Array[String]): Unit = {
lazy val a=pr();//调用的时候不加载
println("-"*20);
println("."*20);
a.hashCode()//使用的时候加载
}
def pr(): Unit ={
println("lazy function")
}
}
该函数的执行结果:
--------------------
....................
lazy function

我们要注意的是,惰性函数在使用过程中,只能修饰val,不能修饰var

四、异常处理

scala的try catch和java一样

作业题:

1.函数可以没有返回值案例,编写一个函数,从终端输入一个数,打印一个金字塔。

object Test {
def main(args: Array[String]): Unit = {
val line=StdIn.readInt()
goldenTower(line)
}
def goldenTower(column:Int): Unit ={
for(value<-Range(0,column,1)){
println(" "*(20-(2*value+1)/2)+"*"*(2*value+1))
}
}
}

2.编写一个函数,从终端输入1-9,打印99乘法表

  def main(args: Array[String]): Unit = {
val line=StdIn.readInt()
multiTable(line)
}
def multiTable(column:Int): Unit ={
for(i<- 1 to column){
for(j<-1 to i){
print(s"$j*$i="+j*i+" "*5)
}
println()
}
}

Scala(二)——基础语法(与Java的区分)和函数式编程的更多相关文章

  1. 062 01 Android 零基础入门 01 Java基础语法 07 Java二维数组 01 二维数组应用

    062 01 Android 零基础入门 01 Java基础语法 07 Java二维数组 01 二维数组应用 本文知识点:二维数组应用 二维数组的声明和创建 ? 出现空指针异常 数组的名字指向数组的第 ...

  2. 010 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 04 变量的三个元素的详细介绍之二——变量类型——即Java中的数据类型

    010 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 04 变量的三个元素的详细介绍之二--变量类型--即Java中的数据类型 Java中变量的三要素 变量名 变 ...

  3. 055 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 02 数组的概念

    055 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 02 数组的概念 本文知识点:数组的概念 数组的声明创建.初始化 在学习数组的声明创建.初始化前,我们可以和之 ...

  4. 054 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 01 数组概述

    054 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 01 数组概述 本文知识点:数组概述 为什么要学习数组? 实际问题: 比如我们要对学生的成绩进行排序,一个班级 ...

  5. 009 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 03 什么是变量?

    009 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 03 什么是变量? 什么是变量? 形象化的生活中的例子理解什么是变量以及变量的三个元素 我们可以根据客人要求 ...

  6. 006 01 Android 零基础入门 01 Java基础语法 01 Java初识 06 使用Eclipse开发Java程序

    006 01 Android 零基础入门 01 Java基础语法 01 Java初识 06 使用Eclipse开发Java程序 Eclipse下创建程序 创建程序分为以下几个步骤: 1.首先是创建一个 ...

  7. 003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程

    003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程 Java程序长啥样? 首先编写一个Java程序 记事本编写程序 打开记事本 1.wi ...

  8. 068 01 Android 零基础入门 01 Java基础语法 08 Java方法 06 参数传递问题——基本数据类型传值

    068 01 Android 零基础入门 01 Java基础语法 08 Java方法 06 参数传递问题--基本数据类型传值 本文知识点:参数传递问题--基本数据类型传值 说明:因为时间紧张,本人写博 ...

  9. 067 01 Android 零基础入门 01 Java基础语法 08 Java方法 05 数组作为方法参数

    067 01 Android 零基础入门 01 Java基础语法 08 Java方法 05 数组作为方法参数 本文知识点:数组作为方法参数 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

  10. 066 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 带参有返回值方法

    066 01 Android 零基础入门 01 Java基础语法 08 Java方法 04 带参有返回值方法 本文知识点:带参有返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

随机推荐

  1. .NET下的对称加密算法

    1.关于.NET下的对称加密算法.    .NET Framework类库提供了对称加密.散列函数.非对称加密.数字签名等现有的主流加密算法..NET中默认实现了4种对称加密算法:DES.Triple ...

  2. 如何创建一个img文件并且mount 它

    https://ubuntuhak.blogspot.com/2012/10/how-to-create-format-and-mount-img-files.html

  3. SQL Server 中 ROWLOCK 行级锁

    一.ROWLOCK的使用 1.ROWLOCK行级锁确保,在用户取得被更新的行,到该行进行更新,这段时间内不被其它用户所修改.因而行级锁即可保证数据的一致性,又能提高数据操作的并发性. 2.ROWLOC ...

  4. Android MVC MVP MVVM (三)

    MVVM Model-View-ViewModel的简写 在MVP基础上实现数据视图的DataBinding,数据变化,视图自动变化,反之也成立. DataBinding 启用DataBinding ...

  5. day37 GIL、同步、异步、进程池、线程池、回调函数

    1.GIL 定义: GIL:全局解释器锁(Global Interpreter Lock) 全局解释器锁是一种互斥锁,其锁住的代码是全局解释器中的代码 为什么需要全局解释器锁 在我们进行代码编写时,实 ...

  6. JVM 和 GC

    一 堆与非堆 Java 虚拟机启动时创建一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配. 在JVM中堆之外的内存称为非堆内存.. 简单来说堆就是Java代码可及的内存,是留给开发人员使 ...

  7. spring-boot 环境搭建(一)

    环境 jdk 8 tomcat 8.5 sts 4.4.2 maven 3.6.1 新建 maven 项目 首先创建一个普通的 maven 项目. pom.xml <project xmlns= ...

  8. C++ MinGW 配合 Sublime Text 搭建

    本文主旨 使用MinGW 和 文本编辑器 Sublime Text,来搭建c++编译的平台. Sublime Text 安装 和 解除限制 http://rainss.cn/essay/1124.ht ...

  9. tp5项目报错no input file specified解决

    关于这个问题众多解决方案 1.php版本问题>5.6,把php版本改成5.5版本 2.入口文件同级目录下的.htaccess文件 RewriteRule ^(.*)$ index.php/$1 ...

  10. tee、vi/vim命令

    一.tee:多重定向 语法:       tee [OPTION] ... [FILE] ... 参数:       将标准输入复制到每个FILE,也复制到标准输出. -a,--append      ...