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

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

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

相关文章

【数据结构】习题之消失的数字和轮转数组

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《数据结构》 &#x1f389;前路漫漫亦灿灿 前言 消失的数字这道题目我会和大家分享三种思路。 还有一道题目是轮转数组&#xff0c;&#xff0c;也会分享三种思路&#xff0c;大…

12 Php学习:魔术常量

PHP魔术常量 PHP 向它运行的任何脚本提供了大量的预定义常量。 不过很多常量都是由不同的扩展库定义的&#xff0c;只有在加载了这些扩展库时才会出现&#xff0c;或者动态加载后&#xff0c;或者在编译时已经包括进去了。 有八个魔术常量它们的值随着它们在代码中的位置改…

vscode配置c\c++及美化

文章目录 vscode配置c\c及美化1.安装vscode2.汉化3.安装c\c插件4.安装mingw5.配置mingw6. 运行c代码6.1 创建代码目录6.2 设置文件配置6.3 创建可执行任务&#xff1a;task.json6.4 编译执行6.5 再写其他代码6.6 运行多个c文件 7. 运行c文件8.调式代码8.1 创建launch.json8.2 修…

在 Elasticsearch 中扩展 ML 推理管道:如何避免问题并解决瓶颈

作者&#xff1a;来自 Elastic Iulia Feroli 是时候考虑语义搜索运营了吗&#xff1f; 无论你是一位经验丰富的搜索工程师&#xff0c;希望探索新的人工智能功能&#xff0c;还是一位机器学习专家&#xff0c;希望更多地利用搜索基础设施来增强语义相似性模型 —— 充分利用这…

【大语言模型】轻松本地部署Stable Diffusion

硬件要求&#xff1a; 配备至少8GB VRAM的GPU&#xff0c;如果你的电脑只有CPU&#xff0c;请看到最后。根据部署规模&#xff0c;需要足够的CPU和RAM。 软件要求&#xff1a; Python 3.7或更高版本。支持NVIDIA GPU的PyTorch。Hugging Face的Diffusers库。Hugging Face的Tr…

前端实现自动获取农历日期:探索JavaScript的跨文化编程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

Spring Boot 学习(5)——开发流程:快速入门

花了几天的时间&#xff0c;整出个 “hello spring boot”&#xff0c;并且把它从 2 搞到了 3。 纸上得来终觉浅&#xff01;自己实践出真知&#xff01;现在再回头来囫囵一遍&#xff0c;加深下印象。回想下从前自觉某一编程语言大都如此&#xff0c;先找到简单示例照着画一遍…

Walmart.com DSV XML对接需求

此前的文章Walmart.com DSV EDI对接需求中&#xff0c;为大家介绍了如果选择传输EDI文件需要做的准备与需求。本文将为大家介绍Walmart.com 与DSV&#xff08;Drop Ship Vender&#xff09;之间传输XML文件的需求。与EDI相比&#xff0c;XML文件的处理难度相对低一些。无论企业…

第1章 计算机网络体系结构

王道学习 【考纲内容】 &#xff08;一&#xff09;计算机网络概述 计算机网络的概念、组成与功能&#xff1b;计算机网络的分类&#xff1b; 计算机网络的性能指标 &#xff08;二&#xff09;计算机网络体系结构与参考模型 计算机网络分层结…

Oracle获取对象的DDL创建语句

1.命令行方式&#xff08;如&#xff1a;sqlplus&#xff09; ## 用户 select dbms_metadata.get_ddl(USER,TEST) from dual;## 表 select dbms_metadata.get_ddl(TABLE,TEST,T1) from dual;## 表空间 select dbms_metadata.get_ddl(TABLESPACE,TBS_NAME) from dual;## 索引 s…

内存函数memcpy、mommove、memset、memcmp

目录 1、memcpy函数 memcpy函数的模拟实现 2、memmove函数 memmove函数的模拟实现 3、memset函数 4、memcmp函数 1、memcpy函数 描述&#xff1a; C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。 声明&…

C/C++基础----判断和循环

判断 if-elseif-else判断 语句&#xff1a; 条件使用之前的逻辑运算符或者关系运算符 if(条件1){条件1成立时内容 }else if(条件2){条件2成立时内容 }else{所有条件不成立时内容 }#include <iostream>using namespace std;int main() {int age 10;if (age > 18) {c…

java数据结构与算法刷题-----LeetCode693. 交替位二进制数

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 位运算 位运算 解题思路&#xff1a;时间复杂度O( 1 1 1)&#…

Mogdb双网卡同步最佳实践

大家都知道Oracle数据库无论是单机还是RAC集群在进行生产部署实施时&#xff0c;我们都会对网卡做冗余考虑&#xff0c;比如使用双网卡&#xff0c;比如public、心跳网络。这样的目的主要是为了安全&#xff0c;避免淡点故障。当然也网卡Bond不仅是可以做主备还可以支持负载均衡…

【OTA】STM32新能源汽车OTA技术ymodem协议PC串口升级过程

【OTA】STM32新能源汽车OTA技术ymodem协议PC串口升级过程 文章目录 前言一、实验工具1.串口USB线——烧录APP2生成的BIN文件2.STLINK——烧录BOOT代码和APP1代码3.烧录工具——将BIN文件烧录到单片机中4.FLYMCU——清除芯片FLASH 二、硬件绘制1.原理图2.PCB 三、软件配置1.BOOT…

树莓派驱动开发--搭建环境篇(保姆级)

前言&#xff1a;树莓派的环境搭建关系到之后的驱动开发&#xff0c;故一个好的环境能让你顺手完成驱动开发&#xff01;我使用的是64位树莓派4b&#xff01;有显示屏的前提&#xff01;&#xff01;&#xff01;&#xff08;因为wifi连接太刁钻了&#xff09; 一、ubantu相关 …

目标检测笔记

目标检测笔记 one-stage和two-stage目标检测算法Two-Stage 目标检测算法One-Stage 目标检测算法既然Faster R-CNN使得候选区域生成和目标检测可以在同一个网络中端到端训练&#xff0c;为什么它还是属于Two-stage算法&#xff1f; 目标检测模型&#xff0c;训练中的正负样本是什…

使用Pandas实现股票交易数据可视化

一、折线图&#xff1a;展现股价走势 1.1、简单版-股价走势图 # 简洁版import pandas as pdimport matplotlib.pyplot as plt# 读取CSV文件df pd.read_csv(../数据集/格力电器.csv)data df[[high, close]].plot()plt.show() 首先通过df[[high,close]]从df中获取最高价和收盘…

UML学习

UML(Unified Modeling Language)&#xff1a;统一建模语言&#xff0c;提供了一套符号和规则来帮助分析师和设计师表达系统的架构、行为和交互 类图&#xff1a;描绘类、接口之间的关系(继承、实现、关联、依赖等)以及类的内部结构(属性和方法)&#xff0c;直观展现系统的静态…

uniapp开发小程序手写板、签名、签字

可以使用这个插件进行操作 手写板-签名签字-lime-signature - DCloud 插件市场 但是目前这个插件没有vue3 setup Composition API的写法。所以对于此文档提供的可以直接使用,需要使用Composition API方式实现的,可以继续看。 因为Composition API方式,更加的简单、灵活,…