scala---基础核心知识(变量定义,数据类型,流程控制,方法定义,函数定义)

一、什么是scala

Scala 是一种多范式的编程语言,其设计初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。

二、为什么要学习scala

1、优雅
2、速度快
3、能融合到hadoop生态圈
4、Spark底层源码是scala语言编写的

函数编程范式更适合用于Map/Reduce和大数据模型,它摒弃了数据与状态的计算模型,着眼于函数本身,而非执行的过程的数据和状态的处理。函数范式逻辑清晰、简单,非常适合用于处理基于不变数据的批量处理工作,这些工作基本都是通过map和reduce操作转换数据后,生成新的数据副本,然后再进行处理。像Spark,Flink,kafka等都是采用Scala开发的,所以学习好大数据,掌握scala是必要的。

三、Scala基础语法知识

1、语言特点

1、面向对象,函数式编程
2、兼容Java,类库可以互相调用
3、语法简洁,代码行短,类型自动推断,抽象控制

2、Scala解释器

Scala解释器读到一个表达式,对它进行求值,将它打印出来,接着再继续读下一个表达式。这个过程被称做读取read–求值eval–打印print–循环loop,即:REPL。实际发生的是,你输入的内容被快速地编译成字节码,然后这段字节码交由Java虚拟机执行。

3、变量定义

var/val 变量名[:变量类型]=变量值
中括号内的内容可以省略,因为scala语言可以自动推断数据类型。
1、Var:修饰的变量,引用可以改变
2、Val:修饰的变量,引用不可以改变

4、数据类型

在java当中,顶级父类是object,在scala当中,顶级父类是Any。
1、Any下面有两个子类,一个是AnyVal,一个是AnyRef
(1)AnyVal:值类型,指的是整型,浮点型,字符型,布尔类型
(2)AnyRef:引用类型,指的是scala的集合,scala的类,java的类
AnyRef有一个子类,是null
AnyVal和AnyRef共有的子类是Nothing
在这里插入图片描述

5、操作符说明

1、Scala调用一些方法或者函数的时候,如果方法或者函数是空参的,可以省略掉()。
2、在Scala中一行表示的结尾不像Java需要使用";",Scala可以省略。

6、流程控制

1、分支语句

	var x = -4
    //分支语句
    val res = {
      if (x > 0) {
        println(x)
      } else {
        "ff"
      }
    }
    println(res)//ff

2、块表达式

	//块表达式     scala 的返回值可以省略return关键字,表达式的最后一句,作为表达式的返回值返回
    //return 关键字通常使用在函数中进行逻辑的终止,比如循环
    var res01={
      1+2
      3+4
      5>9
    }
    println(res01)//false

3、while循环

//while循环   ++  --等自增运算符scala不支持,因为已经被scala集合的对应函数所占据
    var n=1
    var res = while(n<=10){
      n+=1
      println(n)
    }
    println(res)//输出:()
    //注:while语句没有输出值,但是在Scala中,认为每个表达式都有值,这个问题的解决方案是引入一个Unit类,写作(),叫做无用占位符

4、do While循环

	var sum = 0
    var s =1
    do{
      sum += s
      s+=1
      println(s"${s}---${sum}")

    }while(s<=10)

5、for循环

    var sum =0
    //to遍历 1 to 5:[1,2,3...5],左右均为闭合区间,包含左侧元素,也包含右侧元素。
    for (i<- 1 to 5){
      sum+=i
      println(s"${sum}---${i}")
    }
    for(i<- 1.to(8)){
      println(i)
    }

    //until遍历 1 until(5):[1,2,3...5),左闭右开区间,包含左侧元素,不包含右侧元素
    for(i <- 1 until(5)){
      println(i)//1 2 3 4
    }

    //range遍历 左闭右开区间,包含左侧元素,不包含右侧元素,三个参数分别为开始、结束和增量值
    for(i<-Range(1,6,2)){
      println(i)//1 3 5
    }

    //倒序输出
    for(i<-(1.to(5)).reverse){
      println(i)
    }
    for(i<- Range(3,0,-1)){
      println(i)
    }

    //scala守卫模式
    for(i<- 1 to 10 if i%2==0){
      println("---"+i)
    }
    //引入变量
    for(i<-1 to 5; j=5-i){
      println(s"$i---$j")
    }

    //九九乘法表
    for(i <- 1 to 9;j <- 1 to i){
      print(s"$i*$j=${i*j}\t")
      if(i==j){
        println()
      }
    }

6、循环终止

	//1.使用return
    for(j<- 1 to 6){
      if(j==3){
        return
      }
      println(j)
    }

    //2.使用循环条件来控制
    var i =0;
    do{
      i+=1;
      println(i)
    }while(i<5)

    //3.使用breakable函数体来控制
    //相当于continue
    for(i<- 1 to 20){
      breakable{
        if(i==12){
          break()
        }
        println(i)
      }
    }
    //相当于break
    breakable{
      for(i <- 1 to 5){
        if(i==3){
          break()
        }
        println(i)
      }
    }

8、懒加载(lazy)
被lazy所修饰的变量,只有当第一次被使用的时候才会进行初始化,没有使用之前只是记录了存在,检查语法结构是否正确。可以节省一定的资源空间。

7、方法定义
	//方法的最后一句就是该方法的返回值,函数也一样,return可以省略,如果有return,就一定要加上返回值类型
    //def 方法名 (参数名:参数类型,参数名:参数类型)={方法体}
    def hello(name:String,age:Int)={
      name+age
    }
    val res=hello("hhh",22)
    println(res) //hhh22
    
    //def 方法名(参数名:参数类型,参数名:参数类型):返回值类型={方法体}
    def hello2(name:String,age:Int):String={
      name
    }
    val res2=hello2("fff",22)
    println(res2)

    //单行方法
    def hello3(age:Int)={
      age
    }
    val res3=hello3(22)
    println(res3)

    //空参方法
    //定义方法时有小括号,调用的时候可带可不带小括号
    //定义的时候没有小括号,调用的时候不能加小括号
    def hello4={
      println("errr")
    }
    hello4

    //指定参数的方法,带名参数调用方法
    def hello5(name:String,age:Int) ={
      age+name
    }
    val rrr=hello5(age=44,name="xiaowena")
    println(rrr)

    //带默认值的方法
    def hello6(name:String="hhh",age:Int=19)={
      name+age
    }
    val eee=hello6("jjj")
    println(eee)//jjj19
    val eee1=hello6("jjj",33)
    println(eee1)//jjj33
    val eee2=hello6()
    println(eee2)//hhh19

    //多个参数
    def hello7(x:String,y:Int*)={
      var sum = 0
      for(i<-y){
        sum+=1
      }
      sum
    }
    val hh=hello7("mulity",3,4,5,6,7)
    println(hh)//5

    //可变参数
    var arr=Array(1,2,3,4,5)
    def hello8(name:String,age:Int*)={
      var sum=0
      for(i<-age){
        sum+=i
      }
      sum
    }
    //传递数组类型的要以这样arr: _*的方式
    val res4=hello8("tom",arr: _*)
    println(res4)

    //递归方法
    def factory(i:Int):Int={
      if(i==0){
        1
      }else{
        i*factory(i-1)
      }
    }
    val jj=factory(5)
    println(jj)
8、函数定义
 	//创建函数 俗称匿名函数
    //val 函数名=(参数名:参数类型,参数名:参数类型)=>{函数体}
 	val fun=(name:String,age:Int)=>{
      name+age
    }
    val ff=fun("hello",22)
    println(ff)

    //val 函数名:(参数类型,参数类型)=>返回值类型={函数体}
    val fun2:(String,Int)=>String={
      (name,age)=>{
        println("jjjj")
        println(age)
        name
      }
    }
    val ff2=fun2("haoop",12)
    println(ff2)

    //原始的创建函数的真实过程
    val fun3 = new Function3[String,Int,Int,String] {
      override def apply(v1: String, v2: Int, v3: Int):String = {
        v1+v2+v3
      }
    }
    val ff3:String=fun3("xiaom",3,4)
    println(ff3)

    //函数作为参数传递到方法中
    def hello(f:(Int,Int)=>Int)={
      f(2,3)
    }
    val fun5:(Int,Int)=>Int={
      (x,y)=>{
        x-y
      }
    }
    val ff4=hello(fun5)
    println(ff4)//-1

    //创建函数
    val function = new Function2[String, Int, String] {
      override def apply(v1: String, v2: Int): String = {
        v1 + v2
      }
    }
    val fun6:String=function("hhh",77)
    //调用函数并赋值
    println(fun6)//hhh77
9、方法和函数的区别

(1)方法和函数定义形式不同
(2)方法也是函数,函数也是对象
(3)函数可以作为参数传递到方法中去
(4)方法名+空格+下划线(_),就可以把方法变成函数

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

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

相关文章

突破深度模型线上耗时瓶颈,我们做了什么?

广告投放是深度模型应用较为普遍的场景之一&#xff0c;虽然深度模型能够提升业务效果&#xff0c;但往往也会付出更加高额的耗时开销。滴滴现今 DSP&#xff08;Demand-Side Platform&#xff09; 业务场景中&#xff0c;耗时问题已然成为限制模型发挥的魔咒&#xff0c;为了打…

选课成绩管理系统

文章目录 员工管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目&#xff08;9.9&#xffe5;&#xff09; 员工管理系统 一、项目演示 课程管理系统 二、项目介绍 基于springbootvue的前后端分离选课成绩管理系统 该系统可做课程管理…

nginx使用http2,并配置ssl证书

** nginx使用http2&#xff0c;并配置ssl证书 ** 想要使用http2&#xff0c;需要在安装nginx时安装http2模块和ssl模块 前置条件nginx版本需要在1.9.5以上 #解压nginx包 tar -zxvf nginx-1.18.0.tar.gz #进入nginx目录 cd nginx-1.18.0 #执行 ./configure --prefix/usr/lo…

使用 object-fit 属性完美过渡图片

object-fit 属性指定元素的内容应该如何去适应指定容器的高度与宽度&#xff0c; 一般用于 img 和 video 标签&#xff0c;一般可以对这些元素进行保留原始比例的剪切、缩放或者直接进行拉伸等 在我们工作中&#xff0c;经常会遇到附件上传&#xff0c;然后展示多张图片的&…

数字化应用标杆 | 利驰软件助力博方电气提效高达99.8%

数字制造应用标杆合作——利驰✍博方 近日&#xff0c;利驰数字科技&#xff08;苏州&#xff09;有限公司&#xff08;简称 利驰软件&#xff09;与河南博方电气有限公司&#xff08;简称 博方电气&#xff09;成功签订了数字制造应用标杆合作协议&#xff0c;这一里程碑式的合…

Zynq学习笔记--数字视频帧以及同步信号

目录 1. 介绍 2. 重要概念 3. 仿真测试 4. 总结 1. 介绍 Zynq芯片&#xff0c;作为一款集成了高性能FPGA和ARM处理器的系统级芯片(SoC)&#xff0c;为视频处理提供了强大的硬件支持。该芯片内置的丰富视频方面的IP模块&#xff0c;使得从事视频处理项目的开发者能够高效、…

Revo Uninstaller Pro:让卸载不再留下遗憾的专业工具

在数字化时代&#xff0c;我们的电脑中充满了各式各样的软件。然而&#xff0c;当我们想要卸载某些不再需要的程序时&#xff0c;往往会发现卸载并不如安装那般简单。残留的注册表项、碎片化的文件以及顽固的后台进程&#xff0c;这些都可能成为卸载的绊脚石。幸运的是&#xf…

将数字状态码在后台转换为中文状态

这是我们的实体类 可以看出我们的状态status是2如果返回到前端我们根本不知道2代表的是什么&#xff0c;所以我们需要再这里将数字转换成能看懂的中文状态&#xff0c;首先我们创建一个枚举类 先将我们状态码所对应的中文状态枚举出来&#xff0c;然后创建一个静态方法&#…

P1737 [NOI2016] 旷野大计算 题解

题目大意&#xff1a;只允许使用加、取反&#xff08;添负号&#xff09;、偏移&#xff08;加减一个常数&#xff09;、左右移位&#xff08;乘或除以 22 的非负整数次幂&#xff09;和神奇的 &#xfffd;(&#xfffd;)S(x) 函数来进行编程&#xff0c;造一台计算机&#xf…

RocketMQ 存储机制浅析

RocketMQ 是一个典型的发布订阅系统&#xff0c;通过 Broker 节点中转和持久化数据、解耦上下游。Broker 是真实存储数据的节点&#xff0c;由多个水平部署但不一定完全对等的副本组构成&#xff0c;单个副本组的不同节点的数据会达到最终一致。RocketMQ 优异的性能表现&#x…

UE4_动画基础_根运动Root Motion

学习笔记&#xff0c;仅供参考&#xff01; 在游戏动画中&#xff0c;角色的碰撞胶囊体&#xff08;或其他形状&#xff09;通常由控制器驱动通过场景。然后来自该胶囊体的数据用于驱动动画。例如&#xff0c;如果胶囊体在向前移动&#xff0c;系统就会知道在角色上播放一个跑步…

华为“天才少年”4万字演讲:现在的AI技术要么无趣,要么无用

近期&#xff0c;一篇4万字的演讲风靡于国内人工智能&#xff08;AI&#xff09;学术圈。 原华为“天才少年”、Logenic AI公司联合创始人李博杰博士&#xff0c;日前发表了一篇关于AI Agent思考的文章&#xff0c;题为“AI Agent 应该更有趣还是更有用”。 李博杰在这篇文章…

存储过程的创建和调用及删除

目录 存储过程 存储过程的创建 存储过程的调用及删除 在 SQL Plus 中调用存储过程 在 PL/SQL 块中调用存储过程 存储过程的删除 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 存储过程 存储过程是一种命名的 PL/S…

使用Mybatisforeach循环添加字段和值失败问题记录

问题描述: 由于数据表字段非常多,使用foreach循环,key为数据库字段,value为要添加的值.字段中含有小数点的无法正常添加数据 问题展示: 断点展示有值 日志展示获取不到值 sql如下: <insert id"dataMergeInsert" parameterType"java.util.List">IN…

gemini国内怎么用

gemini国内怎么用 Google Gemini 作为一个尚处于研发阶段的大型语言模型&#xff0c;其具体功能和性能尚未公开&#xff0c;因此无法对其好用程度做出明确评价。 然而&#xff0c;基于 Google 在人工智能领域的领先地位和技术实力&#xff0c;我们可以对其潜力进行一些推测&a…

科技云报道:“老三样”不管用了,网络安全要靠啥?

科技云报道原创。 从安全的视角看&#xff0c;网络空间充斥着病毒、黑客、漏洞。在过去&#xff0c;企业习惯用“老三样”——防火墙、IDS、杀毒软件来搞定安全。 如果将网络空间比喻成一个大厦&#xff0c;那么防火墙相当于门锁&#xff0c;用于隔离内外网或不同安全域&…

【MySQL 数据宝典】【内存结构】- 004 自适应哈希索引

自适应哈希索引 https://developer.aliyun.com/article/1230086 什么是自适应哈希索引&#xff1f; 自适应哈希索引是MySQL InnoDB存储引擎中的一种索引结构&#xff0c;用于加速查询。它根据查询模式和数据分布动态地调整自身的大小&#xff0c;以提高性能。 上图就是通过…

hive使用sqoop与oracle传输数据

下载地址 http://archive.apache.org/dist/sqoop 两个版本sqoop1&#xff08;1.4.x&#xff09;和sqoop2&#xff08;1.99.x&#xff09;&#xff0c;两种不同的架构。 本文使用sqoop1。 sqoop是apache旗下一款“hadoop与关系数据库之间传送数据”的工具。 导入数据&#xf…

MES管理系统生产物料管理流程设计的注意事项

随着现代制造业的迅猛发展&#xff0c;MES管理系统在生产物料管理中所扮演的角色愈发重要。一个高效、精准的MES管理系统能够显著提升物料管理的效率&#xff0c;确保生产流程的顺畅进行。然而&#xff0c;在设计生产物料管理流程时&#xff0c;我们需要注意一系列关键问题&…