scala初学之函数定义、流程控制、异常处理入门

特此声明,本文中的代码 部分或全部来源王家林的scala教程;虽然王家林一直被大家所诟病,而且也无法确定这些scala的程序代码是不是他的。但是作为一个初学者觉得就算代码不是他的,他只是拿过来翻译一次,看他的视频也是能了解一些东西的;但是很多东西讲的确实欠缺;所以在学习的过程中把自己的很多思考注释到了他的代码中。一是当作自己的备忘,二也希望能够给大家带来一些些的帮助。

 

进入正文:

 

 

package com.dt.scala.hello/**** 这是第二集视频中的代码* 主要将函数的定义、函数的调用、if判断、循环和控制、异常处理、静态代码块 ** */
object ScalaBasics {//在object中所有的一切都是静态的(包括方法和代码块)//1.方法的定义//1.1无参方法的定义/*def就是用来定义方法的 ;doWhile是方法的名称;Unit是返回类型,相当于java中的void */def doWhile(): Unit={/** 这是一种完全的写法,下面的写法也是正确的* * def doWhile(){}* def doWhile()={}* def doWhile{}* def doWhile={}* def doWhile:Unit={}* * 但是这种定义是不正确的* def doWhile():Unit{}* * 为什么可以省略返回值类型呢?因为scala会把最后一行的变量或者运行结果当作返回值,那么返回值的类型也就由* scala的类型推断机制来完成了 (Unit也是一种变量类型和运行结果)* *///又想起了scala中一个语句后面是不需要写那个;号的,其实挺爽的,写上一万行代码就少敲一万下键盘不是么var line = ""  //这里定义了一个var 类型的变量 这里用var的话,就是说这个line变量可以被多次赋值//也就是说,我写了line = "123";line = "456";这样的多次赋值是可以被接受的。//在java中我们定义一个字符串的时候是这样的 String line = "";这个line在java中也可以被无数次的赋值//其实严格的说scala中我们定义一个字符串的话应该这样来写 var line:String =""//但是我们却可以直接写成 var line =""//主要因为两点  第一、scala中的变量必须初始化 第二、scala中提供了自动的类型转换 //首先来说第一点,我们在java中这样写 String line;是正确的。但是在scala中如果写 //var line:String 错误//var line 错误//var line:String;错误//var line;错误//只有var line:String="" 和 var line=""是正确的//第二点  scala中体中了自动类型转换,也就是说 由于我的变量必须赋值,那么变量的类型完全可以又变量的值来推出//因此 var line:String=""也就变成了var line = "" 不得不说又少敲键盘了/**********************************************************************************************//*和var相对立的还有一个 叫val的标识符,和var一样,val也必须初始化,也可以省略掉变量的类型* 唯一不同地方就是 val 标识的变量初始化以后是不可再赋值的 相当于java中在变量前加上了final关键字一样* 例如 val line = "" ;然后再赋值 line="123"就会报错 ;如同java中的 final String line ="";一样* 在scala中更加鼓励使用val来定义变量,(个人理解,这个对于减少方法的副作用有帮助,同时有利于多线程和函数式编程)* */do{//和java中的do-while循环是一样的line=readLine()//相当于java中的new Scanner(System.in).nextLine(); 这个readLine在scala。Predef包中,scala默认引入该包//其功能就是读入一行用户的输入并赋值给line//也可以简写为 line = readLineprintln("Read: " + line)//输出  相当于java中的System.out.println(-------);}while(line != "")//循环条件为line不是空字符串}//调用见main函数中的1.1//1.2 带参数和返回值的方法的定义// def用来定义函数 looper函数名  x:Long,y:Long 两个Long类型的参数  ):Long 返回值类型def looper(x : Long,y :Long): Long={/*关于方法签名的各种省略写法和doWhile是一致的*/var a=xvar b=y//分别把x和y赋值给了var类型的a和b//因为下边要在循环中不停的修改a和b的值所以是var来定义//那为什么不直接操作x和y呢//因为x和y都是val类型的, 也就是所在scala的所有方法中参数都是val类型的也就是说如果用java来描述这个函数的话应该是这样// public static Long looper(final Long x,final Long y){}//在java的代码重构中提到针对与函数的变量的赋值是一种代码的坏味道,可能会引起代码的副作用//val对于多线程的处理意义重大,大家可以百度while(a!=0){//这就是个循环了 while循环var temp=aa=b%ab=temp}b//···一个孤零零的b变量,直接作为了返回值  乐意的话加上 return也可以 }//函数调用剑main中的1.2def main(args: Array[String]): Unit = {//1.1doWhile //调用doWhile函数  当然写成doWhile()也是正确的,这里又是简写了//1.2println(looper(100,298))//直接输出函数的调用结果//2 if语句//2.1 scala中的if判断var file = "scala.txt"if(!args.isEmpty) file=args(0)//如果传入的参数不为空,赋值为args(0)//2.2 对2.1的简写var fileo = if(!args.isEmpty) args(0) else "scala.txt"//看起来挺新鲜,其实就是java中的 String x = !args.isEmpty()?args(0):"scala.txt";/*两个输出   没啥好说的*/        println(fileo)println(file)//3 for循环//3.1for(i <- 1 to 10){//在java中我们写for(int i=1;i<=10;i++)//首先看看这个 1 to 10 其实是一个语法糖,在scala中做到了一切皆对象,//所以你写个 1 我去这也是一个对象(scala会通过隐士转化的方式把你的1转换为一个RichInt对象)//所以呢 to就是1的一个方法 本尊应该这样写 1.to(10) 这个方法返回一个Range··也就是一个java中的list的意思//所以 <- 这个东西就是 把 1.to(10) 的返回值依次赋给i然后进入循环体中运行println("Number is:" +i)}//3.2 由3.1的分析可以知道 这样写也是对的for(i <- 1.to(10)){println("Number is:" +i)}//3.3 scala中的增强for循环 相当于java中的for(String x:list){}val files= (new java.io.File(".")).listFiles()//这句不用管,就是返回当前目录下的所有文件的一个Array对象for(file <-files){//把files依次赋值给file,进入循环体中运行//我觉得这个就不要说什么增强的for了//因为2.1可以这样写啊//val test=1 to 10//for(i <- test){//println("Number is:" +i)//}//所以只不过是把list的获得放在for()在外和之内的区别,没有像王某说的还有个增强for循环println(file)}//4 初次接触scala中的异常处理val n = 99try {//和java一样,使用try catch finally 结构来做异常处理 ;唯一的改变就是在catch处//抛出一个运行时异常val half =if(n%2==0) n/2 else throw new RuntimeException("n must be even")}catch{//在java中是//catch(xxxxException e){}//..........//catch(Exception e){}//为了处理异常我们会写一档对的catch函数,然后在不同的catch函数中针对特定的异常进行处理//在scala中直接省去了对异常的传入,而且永远只有一个catch了//针对不同的catch我们可以这样写//catch{//case e:xxxxException => doSomeThing//...//case e:Exception => doSomeThing//}//这样写比起java中的一堆堆看起来要舒心了很多啊//case 用来作为一个分支判断  e:Exception 用来指定异常的类型 是case的判断条件 如果 也就是如果//e匹配Exception类型,那么 => 指向了要执行的操作case e:Exception => println("The Exception is : "+e.getMessage())}finally{//和java中的finally的作用相同}}//静态代码块 由于在object中所有的所有都是静态的,所以包括一个语句都是静态的//java中的static{...}在类加载的时候就会执行//这里的三行代码也是一样的,他们没有包含在任何的方法体中,会在代码加载的时候执行 而且是在main函数调用之前执行var line=""line=readLine()println("Read_Out: " + line)
}

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HGOI20190707 题解

Problem A 钢铁侠的诞生 现在有$n$个数字$a_i \leq 10^9 $&#xff0c;然后取出$m$个数字&#xff0c;保证合法。 从小到大输出剩余的$n-m$个数字。 对于100%的数据$m\leq n \leq 3\times 10^5$ Sol : 直接map映射然后用iterator来遍历整个map输出答案即可。 复杂度大概是$O(n…

scala初学之Tuple、Array、Map、文件操作入门实战

特此声明&#xff0c;本文中的代码 部分或全部来源王家林的scala教程&#xff1b;虽然王家林一直被大家所诟病&#xff0c;而且也无法确定这些scala的程序代码是不是他的。但是作为一个初学者觉得就算代码不是他的&#xff0c;他只是拿过来翻译一次&#xff0c;看他的视频也是能…

Java连载3-编译与运行阶段详解JRE,JDK,JVM关系

一、 1.JDK下载地址&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jdk12-downloads-5295953.html 二、Java的加载与执行 1.Java程序运行包括&#xff1a; &#xff08;1&#xff09;编译阶段&#xff1a;检查Java源程序是否符合Java语法&#xff0c;符…

KMP算法NEXT数组纯手工生成

用一个实际的例子来说明&#xff0c;经历了看懂&#xff0c;看不懂&#xff0c;看懂&#xff0c;看不懂&#xff0c;看懂...后我终于决定把它记下来了。 例子字符串为&#xff1a;abaabaca 首先可以肯定&#xff0c;第一个位置永远位0&#xff0c;第二个位置永远为1.那么可以…

P1078 文化之旅

题面 这题好像是初二时老师讲过的一道题&#xff0c;但是。。我没听&#xff1f;&#xff1f;反正没交过就对了。。 我本来想的是深搜spfa&#xff0c;写到50行实现不了&#xff1f;&#xff1f;果断看tj&#xff0c;floyd&#xff1f;&#xff1f;&#xff1f;&#xff08;黑人…

KMP算法中NEXT数组的作用以及代码实现

在http://blog.csdn.net/u012613903/article/details/79004094中写到了如何手工去求一个NEXT数组&#xff0c;这个在很多考试中可以用来解题。但是在实际的使用中&#xff0c;NEXT数组究竟发挥着什么样的作用&#xff0c;如何用代码实现KMP算法呢&#xff1f; KMP算法是用来确…

最长公共连续子串

给出两个字符串&#xff08;可能包含空格&#xff09;,找出其中最长的公共连续子串,输出其长度。 注意这里是找连续子串。 算法&#xff1a;动态规划。f[i][j]表示第一个字符串前i个字符中与第二个字符串前j个中的最长连续子串长度 那么状态转移为&#xff1a;当s1(i)s2(j)时&a…

求最长回文串-从动态规划到马拉车之路(上)

要解决的问题&#xff1a; 给定一个字符串&#xff0c;要求求出这个字符串中的最长的回文串子串。 例子&#xff1a; cbddba的最长回文子串为 bddb cbdedba的最长回文子串为dbedb 由上面的例子可以看到&#xff0c;在考虑回文子串的问题时需要考虑奇偶性。因为奇回文关于中…

为什么Python中称__lt__、__gt__等为“富比较”方法

Python中基类object提供了一系列可以用于实现同类对象进行“比较”的方法&#xff0c;可以用于同类对象的不同实例进行比较&#xff0c;包括__lt__、__gt__、__le__、__ge__、__eq__和__ne__六个方法。 那么为什么叫“富比较”(“rich comparison”)方法呢&#xff1f;查了相关…

求最长回文串-从动态规划到马拉车之路(下)

预备知识&#xff1a; &#xff08;1&#xff09;在一个数轴上有两点i和j&#xff08;i<j&#xff09;关于点m对称&#xff0c;那么有 i 2m-j&#xff1b; 证明&#xff1a; 因为 i<j 且 i 和 j 关于 m 对称&#xff0c;那么有 &#xff08;i j&#xff09;/ 2 m 所…

项目管理实战之团队管理 (转自:zhuweisky)

一个系统不仅需要优秀的分析和设计&#xff0c;更需要一个良好的过程将其从蓝图转化为实现。这个过程中最重要的是对团队的管理&#xff0c;也就是人的管理。一个优秀的团队和一个糟糕的团队的效能是天壤之别&#xff0c;她们之间的比例不是1:100或1:1000这样量化的数字能够表示…

python3 内置方法

# -*- coding:utf-8 -*- # Author: Evan Mi import functools # 取绝对值 print(abs:, abs(-1)) # 如果一个可迭代对象的所有元素都为真&#xff0c;返回true ;空也返回真 print(all:, all([1, 0, -3])) # 有一个为真就全为真 print(any:, any([1, 0, -1])) # 变成可打印的字符…

JS 职责链模式

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><script>/*职责链模式 所有对象依次处理请求&#xff0c;1不能处理传给2&#xff0c;2不能处理传给3....*//*场景 打折 100以下不打折&…

python3字符串常用操作

# -*- coding:utf-8 -*- # Author: Evan Miname "my name is alex"print(name.capitalize()) # 首字母大写 print(name.count("a")) # 统计整个字符中a的个数 print(aaaaa.count("a", 0, len(aaaaa)-1)) # 前闭后开 print(name.center(50, &…

通过NGINX location实现一个域名访问多个项目

location ~ \.php$ {   root /home/webroot; //此目录下有多个项目 project1 &#xff0c;project2...   fastcgi_pass $php_upstream;   fastcgi_index index.php;   include fastcgi.conf; } location ~/project1 {   index index.php;   fastcgi_pass $php_u…

python3 set相关操作

# -*- coding:utf-8 -*- # Author: Evan Mi# 创建一个set list_1 [1, 3, 5, 7, 3, 6, 7, 9] list_1 set(list_1) list_2 set([2, 6, 0, 66, 22, 8, 4]) print(list_1, type(list_1))# 交集 print(list_1.intersection(list_2)) print(list_1 & list_2) # 并集 print(lis…

JDK环境变量

下载打开如下链接&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html &#xff0c;进入JDK1.8下载官网&#xff0c;或者直接百度JDK1.8&#xff0c;也可进入下载官网。 进入官网后&#xff0c;按照所给信息下载对应系统版本的J…

python3字典相关方法

# -*- coding:utf-8 -*- # Author: Evan Miinfo {stu1101: TengLan Wu,stu1102: LongZe Luola,stu1103: XiaoZe Maliya } # 字典是无序的 print(info) print(info[stu1101]) # 不存在会报错 print(info.get(stu1101)) # 不存在返回None print(stu1103 in info) # 判断是否…

Shadow Defender 语言文件并注册

:: ::关闭回显 echo off ::设置标题 title 覆盖 Shadow Defender 语言文件并注册:: ::获取管理员权限 set "_FilePath%~f0" set "_FileDir%~dp0" setlocal EnableExtensions EnableDelayedExpansion fltmc >nul 2>&1 || (echo Set UAC CreateOb…

python3 列表相关操作

# -*- coding:utf-8 -*- # Author: Evan Mi import copynames ["ZhangYang", "Guyun", "XiangPeng", "XuliangChen"] #创建一个列表 names.append("LeiHaiDong") # 给列表的末尾追加元素 names.insert(1, "ChenRongHu…