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/540821.html

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

相关文章

【SpringBoot】获取参数

获取参数 传递单个参数传递多个参数传递对象后端参数重命名传递数组传递 json 数据获取 URL 中参数上传文件获取 cookie 和 session获取cookie获取session 传递单个参数 RequestMapping("/user") RestController public class UserController {// 传递单个参数Reque…

【Delphi 爬虫库 1】GET和POST方法

文章目录 1.最简单的Get方法实现2.可自定义请求头、自定义Cookie的Get方法实现3.提取响应协议头4.实现Post请求完成单词翻译 爬虫的基本原理是根据需求获取信息并返回。就像当我们感到饥饿时&#xff0c;可以选择自己烹饪食物、外出就餐&#xff0c;或者订外卖一样。在编程中&a…

Linux之bpfjit(2)使用分析和mini-tcpdump实现

Linux之bpfjit(2)使用分析和mini-tcpdump实现 Author: Once Day Date: 2024年4月13日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可以参考专栏&#xff1a;…

纯纯python实现梯度下降、随机梯度下降

最近面试有要求手撕SGD&#xff0c;这里顺便就把梯度下降、随机梯度下降、批次梯度下降给写出来了 有几个注意点&#xff1a; 1.求梯度时注意label[i]和pred[i]不要搞反&#xff0c;否则会导致模型发散 2.如果跑了几千个epoch&#xff0c;还是没有收敛&#xff0c;可能是学习率…

Linux 秋招必知必会(三、线程、线程同步)

六、线程 38. 什么是线程 线程是参与系统调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;是进程中的实际运行单位 一个进程中可以创建多个线程&#xff0c;多个线程实现并发运行&#xff0c;每个线程执行不同的任务 主线程&#xff1a;当一个程序启动时&#xff0…

【Qt 学习笔记】Qt控件概述

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt控件概述 文章编号&#xff1a;Qt 学习笔记 / 14 文章目录 Qt控件概…

排序之快速排序

代码 class Solution {public int[] sortArray(int[] nums) {merge(nums, 0, nums.length - 1);return nums;}private void merge(int[] nums, int l, int r){if(l > r) return;// 随机选取主元int i new Random().nextInt(r - l 1) l;int temp nums[i];nums[i] nums[…

探索ElasticSearch高级特性:从映射到智能搜索

欢迎关注我的公众号“知其然亦知其所以然”,获取更多技术干货! 大家好,我是小米!今天我们来聊聊阿里巴巴面试题中的一个高级话题:ElasticSearch(以下简称ES)的高级特性。ES作为一款强大的搜索引擎,在处理大规模数据和复杂查询时发挥着重要作用。而了解其高级特性,则是…

微服务-6 Gateway网关

一、网关搭建 此时浏览器访问 localhost:10010/user/list 后正常返回数据&#xff0c;说明网关已生效&#xff0c;其原理流程图如下&#xff1a; 二、网关过滤器 作用&#xff1a;处理一切进入网关的请求和微服务响应。 1. 网关过滤器的分类&#xff1a; a. 某个路由的过滤器 …

购物车实现

目录 1.购物车常见的实现方式 2.购物车数据结构介绍 3.实例分析 1.controller层 2.service层 1.购物车常见的实现方式 方式一&#xff1a;存储到数据库 性能存在瓶颈方式二&#xff1a;前端本地存储 localstorage在浏览器中存储 key/value 对&#xff0c;没有过期时间。s…

Linux中使用Alias技术实现虚拟网卡

背景 在《Linux中虚拟网络技术有哪些》一文中&#xff0c;我们介绍了多种创建虚拟网卡的方法。本文介绍使用Alias技术创建虚拟网卡。 分析 Alias技术 在计算机领域中&#xff0c;Alias技术指的是给一个实体&#xff08;如文件、命令、网络接口等&#xff09;起一个别名或替代…

【leetcode】 跳跃游戏 IV

跳跃游戏IV 题目思路代码 题目 给你一个整数数组 arr &#xff0c;你一开始在数组的第一个元素处&#xff08;下标为 0&#xff09;。每一步&#xff0c;你可以从下标 i 跳到下标 i 1 、i - 1 或者 j &#xff1a;i 1 需满足&#xff1a;i 1 < arr.length i - 1 需满足&…

C++静态库与动态库

什么是库 库是写好的现有的&#xff0c;成熟的&#xff0c;可以复用的代码。现实中每个程序都要依赖很多基础的底层库&#xff0c;不可能每个人的代码都从零开始&#xff0c;因此库的存在意义非同寻常。 本质上来说库是一种可执行代码的二进制形式&#xff0c;可以被操作系统载…

Linux中磁盘的分区,格式化,挂载和文件系统的修复

一.分区工具 1.分区工具介绍 fdisk 2t及以下分区 推荐 (分完区不保存不生效&#xff0c;有反悔的可能) gdisk 全支持 推荐 parted 全支持 不推荐 ( 即时生效&#xff0c;分完立即生效) 2.fdisk 分区,查看磁盘 格式:fdisk -l [磁盘设备] fdisk -l 查看…

运动听歌哪款耳机靠谱?精选五款热门开放式耳机

随着人们对运动健康的重视&#xff0c;越来越多的运动爱好者开始关注如何在运动中享受音乐。开放式蓝牙耳机凭借其独特的设计&#xff0c;成为了户外运动的理想选择。它不仅让你在运动时能够清晰听到周围环境的声音&#xff0c;保持警觉&#xff0c;还能让你在需要时与他人轻松…

【数据结构】常见的排序算法

&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;个人主页&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; &#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;数据结构专栏&#x1f388;&#x1f388;&#x1f388;&…

基于单链表实现通讯管理系统!(有完整源码!)

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章专栏&#xff1a;C语言实战项目 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、前言 友友们&#xff0c;这篇文章是基于单链…

解决window10 utf-8编码软件中文全部乱码问题

问题描述 很多软件都是乱码状态&#xff0c;不管是Keil还是ISP或者是其他的一些非知名软件&#xff0c;都出现了中文乱码&#xff0c;英文正常显示问题&#xff0c;这个时候是系统出了问题。 解决方法 打开控制面板 点击更改日期、时间或数字格式 点击管理和更改系统区域…

华为云配置安全组策略开放端口

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下…

mysql 查询实战-变量方式-解答

对mysql 查询实战-变量方式-题目&#xff0c;进行一个解答。&#xff08;先看题&#xff0c;先做&#xff0c;再看解答&#xff09; 1、查询表中⾄少连续三次的数字 1&#xff0c;处理思路 要计算连续出现的数字&#xff0c;加个前置变量&#xff0c;记录上一个的值&#xff0c…