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. kubernetes/dashboard Creating sample user

    Creating sample user In this guide, we will find out how to create a new user using Service Account ...

  2. ASP.NET Core 入门笔记4,ASP.NET Core MVC路由入门

    敲了一部分,懒得全部敲完,直接复制大佬的博客了,如有侵权,请通知我尽快删除修改 摘抄自https://www.cnblogs.com/ken-io/p/aspnet-core-tutorial-mvc ...

  3. phpstorm设置的快捷键突然失效了,提示: IdeaVim ...

    下班后,打开PHPstorm,突然感觉不对,经常用的快捷键突然用不了. 例如按了 Ctrl+F 快捷键后,提示:  IdeaVim! Using the Ctrl+F shortcut for Vim ...

  4. Git提交本地项目文件到GitHub的详细操作

    因最近在使用git命令提交代码到github的操作,网上找了下教程,记录下过程,便于查看 添加整个文件夹及内容 git add 文件夹/ 添加目录中所有某种类型的文件 git add *.文件类型 `

  5. kafka原理和操作

    参考: 原理: https://www.cnblogs.com/yinzhengjie/p/9780976.html 常用配置参数: https://www.cnblogs.com/yinzhengj ...

  6. layui-dTree显示不出来且前台报错

    layui-dTree显示不出来且前台报错 Cannot read property 'parents' of null 检查过后发现layer并没有使用到,找不到任何办法解决. 最后删除了respo ...

  7. acm java入门(转载)

    ACM中java的使用 http://www.cnblogs.com/XBWer/archive/2012/06/24/2560532.html 这里指的java速成,只限于java语法,包括输入输出 ...

  8. 2019年9月训练(壹)数位DP (HDU 2089)

    开学之后完全没时间写博客.... HDU 2089 不要62(vjudge) 数位DP 思路: 题目给出区间[n,m] ,找出不含4或62的数的个数 用一个简单的差分:先求0~m+1的个数,再减去0~ ...

  9. [开源] LaravelPlus - 基于 Laravel 魔改,为方便实际业务使用 - 开发中

    目的 为了减少重复 CURD 和新项目的配置麻烦等问题,(就是为了骗星星:LaravelPlus )如: 现有的 infyomlabs/laravel-generator CODE 生成工具虽然好用, ...

  10. Redis主从及哨兵

    Redis主从用法 像MySQL一样,redis是支持主从同步的,而且也支持一主多从以及多级从结构. 主从结构,一是为了纯粹的冗余备份,二是为了提升读性能,比如很消耗性能的SORT就可以由从服务器来承 ...