scala语法(一)(有java基础速学)

news/2024/4/29 13:26:15/文章来源:https://blog.csdn.net/weixin_41772761/article/details/127976801

在拥有java基础上学习scala,注意以下几点

1. 变量声明

var | val 变量名 [: 变量类型] = 变量值
val name: String = "nico"

  1. 声明变量时,类型可以省略(就是叫 类型推断)
    val name= "nico"
  2. 类型确定后,就不能修改,说明Scala 是强数据类型语言.
    val name :String = 123 (报错123为int)
  3. 在声明/定义一个变量时,可以使用var 或者 val 来修饰, var 修饰的变量可改变,val 修饰的变量不可改
    val name :String = "nico" name = "mc" (报错reassignment to val)

2. scala中有Unit类型、Null类型和Nothing类型

Unit类型用来标识过程,类似java里的void,只有一个实例()
null可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型(AnyVal)
Nothing可以作为没有正常返回值的方法的返回类型,是其他任意类型的子类
在这里插入图片描述

3. for循环运算符注意点

    //前后闭合for (i <- -1 to 3) {printf("数字i为%d\n", i)}//前闭后开for (j <- -1 until 3) {printf("数字j为%d\n", j)}//循环守卫 条件true则进入循环 false跳出循环 相当于if写在for里for (k <- -1 to 3 if k != 2) {printf("数字k为%d\n", k)}//循环引入变量 没有关键字val/var 如果是()要用分号隔开 如果用{}换行则不用写分号//for{i <- 1 to 4//	j = 4 - i// 	k = i + 1}{......}for (i <- 1 to 4; j = 4 - i; k = i + 1) {println(s"i=${i} j=${j} k=${k}" )}//嵌套for循环for(i <- 1 to 2; j <- 1 to 2) {println(" i =" + i + " j = " + j)}//将便利结果返回到一个新的集合Vector中,使用yield关键字,yield 可以写代码块val res = for (i <- 1 to 10) yield  (i * 2)println("res=" + res)val res2 = for (i <- 1 to 10) yield  {if (i % 2 == 1) {i}else {()}}println("res2=" + res2)//控制步长for (i <- Range(1,10,3)) { //untilprintln("i=" + i)}

输出结果:

	数字i为-1数字i为0数字i为1数字i为2数字i为3-----------数字j为-1数字j为0数字j为1数字j为2-----------数字k为-1数字k为0数字k为1数字k为3-----------i=1 j=3 k=2i=2 j=2 k=3i=3 j=1 k=4i=4 j=0 k=5-----------i =1 j = 1i =1 j = 2i =2 j = 1i =2 j = 2-----------res=Vector(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)res2=Vector(1, (), 3, (), 5, (), 7, (), 9, ())-----------i=1i=4i=7

4. while循环的中断

Scala内置控制结构特地去掉了break和continue,推荐使用函数式的风格解决break和contine的功能,而不是一个关键字
break:

    breakable { //不加breakable 会被下面的break()报错崩溃var n = 1while (true) {println("n=" + n)n += 1if (n == 3) {//def break(): Nothing = { throw breakException } 抛出breakExceptionbreak() }}}

输出结果

n=1
n=2

continue:
可利用上方守卫循环实现continue

    for (k <- -1 to 3 if k != 2) {printf("数字k为%d\n", k)}

5. 函数相关

函数定义:
def 函数名 ([参数名: 参数类型], ...)[[: 返回值类型] =] { 语句... //完成某个功能 return 返回值 }
其中:
1) 函数可以有返回值,也可以没有
2) 返回值形式1: //[ : 返回值类型 =] 表示有返回值,并且指定了返回值的类型
3) 返回值形式2: //[ = ], 表示返回值类型,使用类型推导
4) 返回值形式3: //[ ] 空的 ,表示没有返回值,即使有return 也不生效

 def sum(n1: Int, n2: Int): Int = {// Scala中的函数可以根据函数体最后一行代码自行推断函数返回值类型。那么在这种情况下,return关键字可以省略//    return n1 + n2n1 + n2}def sum2(n1: Int, n2: Int) = {//    return n1 + n2 因为Scala可以自行推断,所以在省略return关键字的场合,返回值类型也可以省略n1 + n2}//如果没写返回值类型,不能用return 否则报错def sum3(n1: Int, n2: Int) = {//return n1 + n2 报错!!!n1 + n2}//在scala中,支持可变参数, 可变参数只能放在最后def sum4(n:Int,args:Int*): Int = {var res = nfor (i<-args) {res += i}res
}//如果明确函数无返回值或不确定返回值类型,那么返回值类型可以省略(或声明为Any)def f1(n: Int): Any = {if (n == 1) {10} else {"yes"}}
//将函数的返回类型为Unit的函数称之为过程(procedure),如果明确函数没有返回值,那么等号可以省略def sayHello(): Unit = {println("sayHello")}def sayHello1() = {//如果函数声明时没有返回值类型,但是有 = 号,可以进行类型推断最后一行代码。这时这个函数实际是有返回值的,该函数并不是过程。println("sayHello1")}def sayHello2() {println("sayHello2")}

惰性函数:尽可能延迟表达式求值

// lazy 不能修饰 var 类型的变量def main(args: Array[String]): Unit = {lazy val res: Int = sum(1, 2)println(res)lazy val data = 10    // 不但是调用函数时,加了 lazy ,会导致函数的执行被推迟,我们在声明一个变量时,如果给声明了 lazy ,那么变量值得分配也会推迟。 }def sum(i: Int, j: Int): Int = {i + j}}

6. 异常处理

// 案例一
//def main(args: Array[String]): Unit = {try {lazy val i = 20/0println(i)}catch {case exception: Exception => println("异常信息" + exception.getMessage)}finally {println("最终处理")}
// 案例二
//3) 用throw关键字,抛出一个异常对象。所有异常都是Throwable的子类型。throw表达式是有类型的,就是Nothing,因为Nothing是所有类型的子类型,所以throw表达式可以用在需要类型的地方def main(args: Array[String]): Unit = {//    lazy val res: Int = sum(1, 2)//    println(res)try {val res = test()println(res.toString)}catch {case exception: Exception => println("异常信息:" + exception.getMessage)}finally {println("最终出处理结果")}def test(): Nothing = {throw new Exception("不对")}}

输出结果:


异常信息/ by zero
最终处理异常信息:不对
最终出处理结果

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

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

相关文章

【面试题】JS基础-异步

1. 异步 1.1 为什么要异步&#xff1f; JS是单线程语言&#xff0c;只能同时做一件事。JS和DOM渲染共用同一个线程&#xff0c;因为JS可修改DOM结构。当遇到等待的情况时&#xff0c;例如网络请求、定时任务&#xff0c;程序不能卡住。所以需要异步来解决JS单线程等待的问题&…

Git -- submoudule子模块使用

文章目录子模块的作用添加子模块拉取带子模块的项目修改子模块代码子模块的作用 通常情况下&#xff0c;我们做项目时会有几个业务功能区分比较明确的模块&#xff0c;比如简单来说&#xff0c;一个项目我们可以分为认证授权模块、工具类模块、常规业务模块。 而像认证…

【Redis技术探索】「高可用架构模式」哨兵(sentinel)模式实现主从故障互切换模式详解

哨兵&#xff08;sentinel&#xff09;模式实现主从故障互切换模式详解Redis的多种模式Redis单机模式Redis单机模式的优点Redis单机模式的缺点Redis主从复制旧版本配置新版本配置查看主节点信息主从模式的优点主从复制的弊端Redis哨兵模式分析哨兵结构组成哨兵模式的主从切换Re…

重点,一文掌握ReentrantLock加解锁原理!|原创

本文详细讲解了 ReentrantLock 加锁和释放锁的原理&#xff0c;以及和 Synchronized 的对比。本文较长&#xff0c;建议收藏&#xff01;点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达简要总结 ReentrantLock实现原理&#xff1a;volati…

Android入门第33天-Android里的弹出式对话框

简介 Android Studio里在4.0前有一种ProgressDialog&#xff0c;这个已经淘汰了。我们完全可以使用ProgressBar来取代。但是还有一种Dialog叫PopWindow&#xff0c;它是一种“可阻塞式Dialog”。即弹出后除非你给它一个“动作”否则就一直显示在那。 今天我们就来看看这种Dia…

【Linux】基础IO —— 动静态库的制作与使用

&#x1f308;欢迎来到Linux专栏~~动静态库的制作与使用 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自…

Spring Boot 检索定时任务

概述 应用经常需要添加检索功能&#xff0c;开源的 ElasticSearch 是目前全文搜索引擎的首选。他可以快速的存储、搜索和分析海量数据。Spring Boot通过整合Spring Data ElasticSearch为我们提供了非常便捷的检索功能支持。 Elasticsearch是一个分布式搜索服务&#xff0c;提…

Unity3D占用内存太大怎么解决呢? -下

什么时候才是UnusedAssets?看一个例子&#xff1a; Object obj Resources.Load("MyPrefab"); GameObject instance Instantiate(obj) as GameObject; ......... Destroy(instance); 创建随后销毁了一个Prefab实例&#xff0c;这时候 MyPrefab已经没有被实际的物体…

5.XMLHttpRequest对象

XMLHttpRequest简称xhr&#xff0c;是浏览器提供的Javascript对象。之前我们使用的都是jQuery中的Ajax&#xff0c;现在我们使用原生JS的Ajax 目录 1 GET请求 1.1 不带参数请求 1.2 带参数请求 2 URL的编码与解码 2.1 编码 encodeURI() 2.2 解码 decodeURI() 3 …

【通用设计方法】之接收异常保护

目录 前言 一、接收异常保护 二、超短包、背靠背的支持 后记 前言 为了系统的鲁棒性&#xff0c;我们常常会做一系列的异常保护功能&#xff0c;避免系统挂死。 这里仅仅介绍接收保护的某些设计思路&#xff0c;抛砖引玉。 一、接收异常保护 设计思路&#xff1a;通过可配…

数据可视化大屏设计

在数据业务展示场景中&#xff0c;数据可视化大屏已经变得十分常见。那么在设计思路上&#xff0c;数据可视化大屏应当遵循什么样的设计逻辑&#xff1f;本篇文章里做了介绍&#xff0c;一起来看一下。 一、数据大屏的应用场景 1、大型会议 2、业务展示 二、数据大屏分类 1、展…

C语言源代码系列-管理系统之会员计费系统

往期文章分享点击跳转>《导航贴》- Unity手册&#xff0c;系统实战学习点击跳转>《导航贴》- Android手册&#xff0c;重温移动开发 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过…

【Python百日进阶-WEB开发-冲進Flask】Day183 - Flask数据库ORM基础、增加

文章目录一、day03项目环境和结构搭建1.1 flask-script1.1.1 flask-script是干什么的&#xff1f;1.1.2 flask-script安装1.1.3 flask-script的使用1.1.3.1 创建Manager实例1.1.3.2 初始化实例出错与解决1.1.4 终端启动1.1.4.1 查看runserver参数1.1.5 自定义添加manager命令1.…

linux篇【11】:linux下的线程<前序>

目录 一.linux下的线程 1.linux下的线程概念 &#xff08;1&#xff09;教材上粗略的 线程 定义 &#xff08;2&#xff09;线程的引入 &#xff08;3&#xff09;线程真正定义 以及 示意图 &#xff08;4&#xff09;linux 和 windows等其他操作系统的线程对比 &#xf…

新的趋势:From Big to Small and Wide data

新的趋势&#xff1a;From Big to Small and Wide data 所以&#xff0c;在这个时候&#xff0c;作为率先提出要做 MySQL 开源 HTAP 数据库的 StoneDB&#xff0c;想要稍微冷静一下。 不是说我们不做 HTAP 了&#xff0c;而是有了一个新的思路。这个思路&#xff0c;也同样来…

【亲测】网址引导页管理系统

介绍&#xff1a; 易航网址引导系统-网址引导页管理系统去授权版一款极其优雅的易航网址引导页管理系统&#xff0c; 如果有问题可以跟我反馈&#xff0c;共同进步。祝各位道友一路飞升&#xff0c;顶峰相见&#xff01;内置12套模板和防墙插件。 项目亮点&#xff1a; 1、…

Redis基础命令(String类型)Value为JSON

目录 String类型&#xff08;存储的值为JSON形式&#xff09; 问题&#xff1a; 解决办法&#xff1a; 示例&#xff1a; 实际操作&#xff1a; 总结&#xff1a; String类型&#xff08;存储的值为JSON形式&#xff09; 问题&#xff1a; Redis没有类似MySql中的表的概…

2022年戈登·贝尔奖授予等离子体加速器突破研究

ACM 总裁Cherri Pancake&#xff08;图片来源&#xff1a;网络&#xff09; 11月17日&#xff0c;在达拉斯举行的SC22颁奖典礼上&#xff0c;ACM将2022年戈登贝尔奖&#xff08;Gordon Bell Prize&#xff09;授予了一组研究人员&#xff0c;他们利用四台超级计算机&#xff08…

【Flink】基本转换算子使用之fliter、flatMap,键控流转换算子和分布式转换算子

文章目录一 Flink DataStream API1 基本转换算子的使用&#xff08;1&#xff09;flitera 使用匿名类实现b 使用外部类函数实现b 使用flatMap实现&#xff08;2&#xff09;flatMapa 使用匿名类实现b 使用匿名函数实现2 键控流转换算子&#xff08;1&#xff09; keyBy&#xf…

中国互联网众筹行业

近些年&#xff0c;中国互联网发展迅速&#xff0c;众筹这种起源于美国的新型互联网金融模式更是一直处于风口浪尖。在“大众创业、万众创新”的背景下&#xff0c;这种低门槛的融资模式也深受欢迎&#xff0c;加上阿里、京东、苏宁三大电商的巨头的相继入场&#xff0c;更令这…