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. JavaScript(5)—— 变量及数据类型

    JavaScript和Java在概念和设计方面都是完全不同的语言.JavaScript由Brendan Eich于1995年发明,并于1997年成为ECMA标准.ECMA-262是官方名称.ECMAS ...

  2. python字典操作+文件操作+函数

    师从百测besttest今天老牛教了些函数调用的知识,布置了个作业如下: # 1.写一个商品管理的小程序# 2.商品存在文件里面# 1.添加商品# 输入产品名称.颜色.价格# 要校验商品是否存在,价格 ...

  3. MariaDB基本知识点总结01--介绍+语句

    一.概念 1.数据库介绍: 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库提供的多种方法来管理数据 ...

  4. LCA -cogs2098 [SYOI 2015] Asm.Def的病毒

    题目链接:http://cogs.pro:8081/cogs/problem/problem.php?pid=vQXmxVaPU [题目描述] “这就是我们最新研制的,世界上第一种可持久化动态计算机病 ...

  5. 奥比中光Astra Pro的使用(1)

    在ubuntu上的使用 首先下载SDK以及OpenNI安装包,下载地址: 解压两个安装包 切换目录到AstraSDK-Linux下的install目录,并输入命令:sudo sh ./install. ...

  6. jQuery之克隆事件--clone()与clone(true)区别

    clone()与clone(true)同为克隆 clone()表示复制标签本身, clone(true)会将标签绑定的事件一起复制 来看案例: <!DOCTYPE html> <ht ...

  7. 【LOJ】#3031. 「JOISC 2019 Day1」聚会

    LOJ#3031. 「JOISC 2019 Day1」聚会 听说随机可过? 我想了很久想了一个不会被卡的做法,建出前\(u - 1\)个点的虚树,然后找第\(u\)个点的插入位置,就是每次找一条最长链 ...

  8. how to Simply Singleton Navigate the deceptively simple Singleton pattern---reference

    http://www.javaworld.com/article/2073352/core-java/simply-singleton.html JAVA DESIGN PATTERNS By Dav ...

  9. LinqToSQL3

    Lambda Lambda表达式和匿名方法很相似,但Lambda表达式比匿名方法更灵活,并且语法比匿名方法更简洁. 在LINQ中可以使用Lambda表达式创建委托,这些委托将稍后执行查询时被调用. L ...

  10. 添加Entity Framework Core,数据库迁移

    1.建立Entity 建立IEntity的接口 建立实现IEntity接口的抽象类Entity 建立类继承抽象类Entity 2. 数据库放到infrastructure的项目中 3.注册和配置这个d ...