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+23+45>9}println(res01)//false
3、while循环
//while循环 ++ --等自增运算符scala不支持,因为已经被scala集合的对应函数所占据var n=1var res = while(n<=10){n+=1println(n)}println(res)//输出:()//注:while语句没有输出值,但是在Scala中,认为每个表达式都有值,这个问题的解决方案是引入一个Unit类,写作(),叫做无用占位符
4、do While循环
var sum = 0var s =1do{sum += ss+=1println(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+=iprintln(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.使用returnfor(j<- 1 to 6){if(j==3){return}println(j)}//2.使用循环条件来控制var i =0;do{i+=1;println(i)}while(i<5)//3.使用breakable函数体来控制//相当于continuefor(i<- 1 to 20){breakable{if(i==12){break()}println(i)}}//相当于breakbreakable{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)//jjj19val eee1=hello6("jjj",33)println(eee1)//jjj33val eee2=hello6()println(eee2)//hhh19//多个参数def hello7(x:String,y:Int*)={var sum = 0for(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=0for(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)方法名+空格+下划线(_),就可以把方法变成函数
相关文章:
scala---基础核心知识(变量定义,数据类型,流程控制,方法定义,函数定义)
一、什么是scala Scala 是一种多范式的编程语言,其设计初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。 二、为什么要学习scala 1、优雅 2、速度快 3、能融合到hado…...
OSPF星型拓扑和MGRE全连
一,拓扑 二,要求 1,R6为ISP只能配置IP地址,R1-R5的环回为私有网段 2,R1/4/5为全连的MGRE结构,R1/2/3为星型的拓扑结构, 3,R1为中心站点所有私有网段可以互相通讯,私有网段…...
智能时代中的工业应用中前所未有的灵活桥接和I/O扩展功能解决方案MachXO2系列LCMXO2-1200HC-4TG100I FPGA可编程逻辑IC
lattice莱迪斯 MachXO2系列LCMXO2-1200HC-4TG100I超低密度FPGA现场可编程门阵列,适用于低成本的复杂系统控制和视频接口设计开发,满足了通信、计算、工业、消费电子和医疗市场所需的系统控制和接口应用。 瞬时启动,迅速实现控制——启动时间…...
php:实现压缩文件上传、解压、文件更名、压缩包删除功能
效果图 1.上传文件 2.压缩包文件 3.itemno1文件 或 4.上传到系统路径\ItemNo 5.更名后的itemno1文件(命名:当天日期六位随机数) 代码 <form action"<?php echo htmlspecialchars($_SERVER[PHP_SELF], ENT_QUOTES, UTF-8); ?>" methodpost en…...
【机器学习】科学库使用第5篇:Matplotlib,学习目标【附代码文档】
机器学习(科学计算库)完整教程(附代码资料)主要内容讲述:机器学习(常用科学计算库的使用)基础定位、目标,机器学习概述定位,目标,学习目标,学习目标,1 人工智能应用场景,2 人工智能小…...
Java面试八股文(JVM篇)(❤❤)
Java面试八股文_JVM篇 1、知识点汇总2、知识点详解:3、说说类加载与卸载11、说说Java对象创建过程12、知道类的生命周期吗?14、如何判断对象可以被回收?17、调优命令有哪些?18、常见调优工具有哪些20、你知道哪些JVM性能调优参数&…...
「51媒体」如何有效进行媒体邀约,提升宣传传播效果?
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 进行有效的媒体邀约,提升宣传传播效果的关键在于策略性和专业性。以下是具体的做法: 明确目标:要确立清晰的品牌推广目标和策略,包括确定目…...
docker初始化进程
docker run --init 是一个 Docker 命令的选项,用于在容器中运行一个初始化进程(通常是 tini)。这个初始化进程负责处理一些 Unix 信号(如 SIGTERM 和 SIGCHLD),并确保容器中的进程能够正确地被管理和清理。…...
基于快照行情的股票/基金 1分钟 K 线合成指南
1. 概述 由于不同交易所不同资产的交易规则是有差异的,导致不同交易所基于快照行情或逐笔成交合成不同资产1分钟 K 线的计算方法是不同的。 本教程旨在提高 DolphinDB 在具体业务场景下的落地效率,降低 DolphinDB 在实际业务使用中的开发难度。 本教程…...
新质生产力崛起:精益化能力助力企业转型升级
在智能制造、物联网、大数据、大模型、AI风起云涌的时代背景下,一个崭新的概念——“新质生产力”逐渐进入了人们的视野。这一热词不仅成为今年两会的讨论焦点,更代表了企业、国家乃至社会未来发展的核心动能。那么,什么是新质生产力…...
开发了一个在线客服系统
开发了一个在线客服系统 作为程序员,我一直在寻找能够提高工作效率和用户体验的方法。最近,我成功开发了一个在线客服系统,这个系统旨在帮助企业更高效地管理客户咨询和服务流程。 技术栈 我选择了以下的技术栈来构建这个系统:…...
cowa新的数据筛选代码
cowa新的数据筛选代码 代码地址: https://git.cowarobot.com/lhb/data_extracting 一阶段筛选 修改配置文件 config/common_stage.yamlversion: 3 services:de:image: harbor.cowarobot.cn/lhb/data:crpilot2.5-torch2.2environment:- CRPILOT_INSTALL_VERSIONx86…...
项目篇 | 图书管理系统 | 管理员模块 | 图书管理 | 删除
项目篇 | 图书管理系统 | 管理员模块 | 图书管理 | 删除 概述 图书管理页通过列表展示所有图书的相关信息,集成了搜索、添加、删除、修改的功能。 函数简介 // admin.h void delBook(); // 删除图书 void openDelBookMessage(); // 打开删除图书弹框 void closeDelBookMessa…...
自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南
文章目录 一、构建方法1、api/request.js2、api/requestHandler.js3、api/index.js 二、测试方法1、api/axios.js2、main.js3、app.vue4、vue.config.js5、index.html 三、打包1、配置package.json2、生成库包3、配置发布信息4、发布 四、使用1、安装2、使用 五、维护1、维护和…...
【Sql Server】锁表如何解锁,模拟会话事务方式锁定一个表然后进行解锁
大家好,我是全栈小5,欢迎来到《小5讲堂》。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 前言创建表模拟…...
【大语言模型】轻松本地部署Stable Diffusion
硬件要求: 配备至少8GB VRAM的GPU,如果你的电脑只有CPU,请看到最后。根据部署规模,需要足够的CPU和RAM。 软件要求: Python 3.7或更高版本。支持NVIDIA GPU的PyTorch。Hugging Face的Diffusers库。Hugging Face的Tr…...
【github主页】优化简历
【github主页】优化简历 写在最前面一、新建秘密仓库二、插件卡片配置1、仓库状态统计2、Most used languages(GitHub 常用语言统计)使用细则 3、Visitor Badge(GitHub 访客徽章)4、社交统计5、打字特效6、省略展示小猫 …...
dnspy逆向和de4dot脱壳
拿到一个软件,使用dnspy查看,发现反汇编后关键部分的函数名和代码有很多乱码: 这样的函数非常多,要想进一步调试和逆向,就只能在dnspy中看反汇编代码了,而无法看到c#代码,当时的整个逆向过程只剩…...
python之flask安装以及使用
1 flask介绍 Flask是一个非常小的Python Web框架,被称为微型框架;只提供了一个稳健的核心,其他功能全部是通过扩展实现的;意思就是我们可以根据项目的需要量身定制,也意味着我们需要学习各种扩展库的使用。 2 python…...
汽车笔记-保险
保险 1.交强险 上路必须买的, 国家规定必须要买。交强险不管你是有责还是无责,它都是可以赔偿的。交强险还有一个18000的垫付功能,比如说我们出了交通事故后,对方住院治疗需要你垫付钱,那么这个时候就可以用到交强险…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
