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

news2024/11/25 4:53:28

一、什么是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)方法名+空格+下划线(_),就可以把方法变成函数

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

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

相关文章

ADOP-400G光模块问题发布会

前沿光学&#xff08;ADOP&#xff09;400G光模块为客户提供各种超高密度的400G以太网连接方案&#xff0c;广泛应用于数据中心、企业网和服务提供商。 &#x1f4e3;&#x1f4e3;以下一些问题是我们新一代400G光模块常能遇见问题&#xff0c;所以我们决定在这里开一场小小的…

ubuntu22安装宝塔面板

方法一&#xff1a;运行安装宝塔命令 wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec 安装成功后&#xff0c;需到服务器管理后台的安全组中配置新规则&#xff0c;放行宝塔面板的端口&#xff08;以阿…

基于SSM和vue的机票订购管理系统

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM和vue的机票订购管理系统2拥有两种角色 管理员&#xff1a;用户管理、机票管理、订票管理、公告管理、广告管理、系统管理、添加机票等 用户&#xff1a;登录注册、订票、查看公…

论文复现《SplaTAM: Splat, Track Map 3D Gaussians for Dense RGB-D SLAM》

前言 SplaTAM算法是首个开源的基于RGB-D数据&#xff0c;生成高质量密集3D重建的SLAM技术。 通过结合3DGS技术和SLAM框架&#xff0c;在保持高效性的同时&#xff0c;提供精确的相机定位和场景重建。 代码仓库&#xff1a;spla-tam/SplaTAM: SplaTAM: Splat, Track & Map 3…

MySQL表级锁——技术深度+1

引言 本文是对MySQL表级锁的学习&#xff0c;MySQL一直停留在会用的阶段&#xff0c;需要弄清楚锁和事务的原理并DEBUG查看。 PS:本文涉及到的表结构均可从https://github.com/WeiXiao-Hyy/blog中获取&#xff0c;欢迎Star&#xff01; MySQL表级锁 MySQL中表级锁主要有表锁…

【简单介绍下PostCSS】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

如何实现在 Windows 上运行 Linux 程序?

在Windows 上运行Linux程序是可以通过以下几种方法实现: 1.使用 Windows Subsystem for Linux (WSL): WSL是微软提供的功能&#xff0c;可以在Windows 10上运行一个完整的Linux系统。用户可以在Microsoft Store中安装所需的 在开始前我有一些资料&#xff0c;是我根据网友给的…

SQL --索引

索引 INDEX 伪列 伪装起来的列&#xff0c;不容易被看见&#xff0c;要特意查询才能看见 ROWNUM&#xff1a; 是对查询结果自动生成的一组连续的自然数序号。 SELECT emp.*,ROWNUM FROM emp例题&#xff1a;查询emp表中&#xff0c;前三个员工 SELECT * FROM * from emp w…

Midjourney 实现角色一致性的新方法

AI 绘画的奇妙之处&#xff0c;实乃令人叹为观止&#xff01;就像大千世界中&#xff0c;寻不见两片完全相同的树叶一般&#xff0c;AI 绘画亦复如是。同一提示之词&#xff0c;竟能催生出千变万化的图像&#xff0c;使得AI所绘之作&#xff0c;宛如自然之物般独特&#xff0c;…

将百度网盘中数据集直接下载到服务器上

步骤&#xff1a; 1:下载安装bypy pip install bypybypy&#xff0c;是一个使用 python 编写的命令行百度网盘客户端 2:初始化 bypy info将这个链接复制到浏览器中打开 复制授权码&#xff0c;粘贴到服务器命令&#xff0c;回车 等待一会&#xff0c;会显示你云盘空间大小信…

【小白学机器学习14】确定零假设h0的技巧:先根据错误的严重程度确定第1类错误α,再确定零假设h0

目录 1 前言: 如何确定H0的逻辑思路 1.1 推导的原理 2 假设检验的2类错误 2.1 什么叫2类错误 2.2 这两类错误的计算公式 2.2.1 计算公式 2.2.2 第1类错误和第2类错误的特点 3 如何设计H0的一些例子和思考 3.1 很多书上的原则1&#xff1a;备择假设通常才是研究者最想证…

多高的学历才能轻松找到工作?这个热点有点扯吧~

先来唠唠 昨天刷脉脉的时候&#xff0c;热榜第一的内容吸引了我&#xff1a;多高的学历才能轻松找到工作&#xff1f; 现在这行情&#xff0c;不管多高得学历都很难说能轻松找到工作吧~ 评论区也有不少小伙伴发表自己的见解&#xff0c;比如&#xff1a; 学历固然是非常重要…

2D动画制作软件Moho Pro14 mac注册激活版

Moho Pro 14 for mac 是一款专业的2D动画制作软件。它具有强大的功能和工具&#xff0c;适用于动画制作师、插画师和设计师。 Moho Pro14 mac注册激活版下载 Moho Pro 14提供了丰富的动画功能&#xff0c;包括骨骼动画、形状插值、帧逐帧动画等。您可以使用骨骼工具来创建复杂的…

中缀表达式求值

题目 请写一个整数计算器&#xff0c;支持加减乘三种运算和括号。 示例1 输入&#xff1a;“12” 返回值&#xff1a;3示例2 输入&#xff1a;“(2*(3-4))*5” 返回值&#xff1a;-10示例3 输入&#xff1a;“32*3*4-1” 返回值&#xff1a;26 思路 经典的中缀表达式求值。…

Ubuntu 20.04.06 PCL C++学习记录(二十六)

[TOC]PCL中点云配准模块的学习 学习背景 参考书籍&#xff1a;《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,&#xff0c;PCL版本为1.10.0&#xff0c;CMake版本为3.16&#xff0c;可用点云下载地址 学习内容 在代码中使用ICP迭代最近点算法&#xff0c;程序随机…

游戏前摇后摇Q闪E闪QE闪QA等操作

备注&#xff1a;未经博主允许禁止转载 个人笔记&#xff08;整理不易&#xff0c;有帮助&#xff0c;收藏点赞评论&#xff0c;爱你们&#xff01;&#xff01;&#xff01;你的支持是我写作的动力&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_w…

负荷预测 | Matlab基于TCN-LSTM-Attention单变量时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.负荷预测 | Matlab基于TCN-LSTM-Attention单变量时间序列多步预测&#xff1b; 2.单变量时间序列数据集&#xff0c;采用前12个时刻预测未来96个时刻的数据&#xff1b; 3.excel数据方便替换&#xff0c;运行环境ma…

请陪伴Kimi和GPT成长

经验的闪光汤圆 但是我想要写实的 你有吗&#xff1f; 岁数大了&#xff0c;希望如何学习新知识呢&#xff1f;又觉得自己哪些能力亟需补强呢&#xff1f; 看论文自然得用Kimi&#xff0c;主要是肝不动了&#xff0c;眼睛也顶不住了。 正好昨天跟专业人士学会了用工作流的办法跟…

buuctf之ciscn_2019_c_1

ciscn_2019_c_1 一、查看属性二、静态分析三、动态分析四、思路五、exp 一、查看属性 首先还是必要的查看属性环节&#xff1a; 可以知道该文件是一个x86架构下的64位小端ELF文件&#xff0c;开启了栈不可执行&#xff08;NX&#xff09; 执行一下&#xff0c;先有一个选择&…

树莓派+Openwrt连接校园网,打破校园网设备限制

前言 因为本校学生校园网只允许最多三个设备登录&#xff0c;对于同时拥有多个联网设备的我十分不友好&#xff0c;而且大多单片机如esp32的wifi模块是只允许一般的WPA/WPA2认证的&#xff0c;是不支持校园网的portal认证。所以我决定搞一个路由器。 然后我上网买了一个TP-Li…