实训笔记9.12

实训笔记9.12

  • Scala笔记
    • 一、学习Scala的目的
    • 二、Scala的基本概念
      • 2.1 JDK1.8版本的新特性
      • 2.2 Scala的运行机制
    • 三、Scala的基本语法
      • 3.1 Scala中输出语句、键盘输入、注释语法
        • 3.1.1 Scala注释三种,和Java一模一样的
        • 3.1.2 Scala键盘输入
        • 3.1.3 Scala输出
      • 3.2 Scala变量和常量
      • 3.3 Scala中标识符
      • 3.4 Scala中的数据类型
      • 3.5 Scala中运算符
        • 3.5.1 算术运算符
        • 3.5.2 赋值运算符
        • 3.5.3 比较运算符
        • 3.5.4 逻辑运算符
        • 3.5.5 位运算符
      • 3.6 Scala中流程控制
        • 3.6.1 分支流程
        • 3.6.2 循环流程
    • 四、Scala的函数式编程
      • 4.1 函数的基本语法
      • 4.2 函数的形参列表问题
      • 4.3 函数的返回值问题
      • 4.4 函数的高阶函数
        • 4.4.1 函数当变量使用:把函数重命名了
        • 4.4.2 函数当参数来使用
        • 4.4.3 函数当作返回值来使用
      • 4.5 函数的高级使用
        • 4.5.1 函数的闭包问题
        • 4.5.2 函数的柯里化
        • 4.5.3 递归函数
        • 4.5.4 函数的惰性加载
      • 4.6 函数的简化操作
        • 4.6.1 声明的简化
        • 4.6.2 调用的简化:一般不建议使用,建议运算符的函数调用简化
    • 五、 Scala中面向对象
      • 5.1 包和import导入
        • 5.1.1 Scala包有两种管理代码的方式
        • 5.1.2 Scala中类的导入问题import
      • 5.2 面向对象中的类
        • 5.2.1 类的定义
        • 5.2.2 访问控制符
      • 5.3 面向对象中类的属性
        • 5.3.1 属性
        • 5.3.2 声明语法
      • 5.4 面向对象中类的方法
        • 5.4.1 方法
        • 5.4.2 语法
      • 5.5 面向对象中类的代码块和内部类
      • 5.6 面向对象中类的构造器
        • 5.6.1 构造器是创建该类的实例对象的
    • 六、Scala中集合
    • 七、Scala中的隐式转换
    • 八、Scala中_的作用

Scala笔记

一、学习Scala的目的

Spark、Kafka等相关大数据技术框架底层都是由Scala编程语言编写的,Spark我们自己编写分布式程序时,Spark提供了多种编程语言风格,但是我们比较常用的是使用Scala编程。

二、Scala的基本概念

Scala是一门多范式编程语法,所谓多范式指的就是多种编程风格的语法,Scala主要是一门面向对象编程语言和函数式编程语言。

Scala的发明人是马丁奥德斯基,Scala语言2001年左右诞生的,融合了Java和JS中很多特性。

同时Java中很多特性也是从Scala语言中吸收到,JDK8.0版本拉姆达表达式就是从Scala中吸收到

2.1 JDK1.8版本的新特性

  1. Java中函数编程式接口、拉姆达表达式、方法引用 接口的组成、时间日期类、Stream API、Optional类(解决NullPonitException的)

  2. Java中的拉姆达(λ)表达式是和Java中的一个接口紧密相关的,接口函数式编程接口(接口中只有一个抽象方法)

    语法:(形参列表)-> {方法体;}

    package lambda;import java.io.PrintStream;public class Demo {public static void test(Flyable flyable){flyable.fly("zs");}public static void test1(A a){}/*** 使用函数式编程接口时,如果我们采用匿名内部类的形式,必须要去重写唯一的抽象方法,而且匿名内部类最核心的也是抽象方法* 所以此时我们就是使用拉姆达表达式将匿名内部类的代码给简化了即可** (形参列表) -> {方法体}  就是抽象方法的简化* @param args*/public static void main(String[] args) {test(System.out::println);test(name-> System.out.println(name));}
    }interface A{default void run(String name){}default int call(){return 0;}
    }package lambda;@FunctionalInterface
    public interface Flyable {void fly(String name);static int run(){ return 0;}
    }
    

    拉姆达表达式的简化:

    1. 形参列表的类型可以省略的,因为拉姆达表达式对应的函数式编程接口的抽象方法是确定的
    2. 如果参数列表只有一个 那么形参列表的()可以省略的
    3. 如果方法体只有一行代码,而且这一行代码没有return关键字,那么方法体的{}可以省略,而且这一行代码不需要加分号
  3. Java中的方法引用相当于是拉姆达表达式的升级版本,主要就是用来替换整个拉姆达表达式的,当拉姆达表达式的方法体是引用了另外一个类的方法,并且方法体中没有多余的代码时,可以使用方法引用来简化代码

2.2 Scala的运行机制

  1. 编写xxx.scala源码文件,源码文件中可以使用Scala的SDK也可以使用Java的SDK
  2. 使用scalac编译xxx.scala源码文件成为Java的二进制字节码文件xxx.class
  3. 使用scala命令将xxx.class加载到Java的JVM虚拟机当中运行的

三、Scala的基本语法

3.1 Scala中输出语句、键盘输入、注释语法

3.1.1 Scala注释三种,和Java一模一样的

3.1.2 Scala键盘输入

  1. 直接无缝衔接使用Java的键盘输入 Scanner
  2. 使用Scala提供的自带的键盘输入 StdIn.readxxx()

3.1.3 Scala输出

  1. 使用Java的输出语句 System.out.xxx
  2. 普通输出:print()/println()
  3. 模板输出:print/println(s"xxxxx$变量名")
  4. 占位符输出:print/println("xxxxx%s %d",变量,变量)

3.2 Scala变量和常量

语法: var|val 变量名|常量名【:数据类型】 = 初始值;

【注意】虽然Scala中数据类型可以省略,但是Scala是一门强类型编程语法

3.3 Scala中标识符

  1. Scala的标识符由字母、数字、下划线、数学符号、$美元符号组成的,其中数字不能开头
  2. 如果标识符以数学符号开头,那么标识符中只能包含数学符号
  3. Scala标识符可以是关键字和保留字,但是关键字和保留字需要使用``包括

3.4 Scala中的数据类型

Scala是一门纯面向对象的编程语言,因此在Scala中所有的数据类型都是对象

Scala中所有类型的顶尖父类:Any,Any有两个直接子类:AnyVal、AnyRef

AnyVal是值类型:Byte、Short、Int、Long、Float、Double、Char、Boolean、Unit

AnyRef是引用类型:Java中所有类、Scala中所有类、Scala中所有集合、Null

Unit、Null、Nothing三个比较特殊的类型

3.5 Scala中运算符

3.5.1 算术运算符

没有++ –

3.5.2 赋值运算符

+= -=…

3.5.3 比较运算符

Scala中==代表比较值相等,比较地址相等用eq函数

3.5.4 逻辑运算符

3.5.5 位运算符

【注意】Scala运算符本质上是一个函数,函数的名字是数学符号,正常情况下运算符的使用语法应该如下: 1 + 1 1.+(1)

函数调用的时候可以简化:

  1. 函数调用的点可以省略的
  2. 如果函数的参数只有一个,那么()可以省略的

3.6 Scala中流程控制

顺序流程:代码遵循从上而下依次执行

3.6.1 分支流程

  1. if类型的分支:Java一模一样的

  2. 模式匹配

    1. 语法:

       x  match{                   case|x  [模式守卫if]  =>   case分支语句                   case|x  [模式守卫if]  =>   case分支语句                   case  _   =>  case分支语句             }
      
    2. 【模式守卫】模式守卫可以做范围匹配,一般使用模式守卫时,case需要x

3.6.2 循环流程

  1. for循环

    1. until型的for循环:

      for(i <- start until end)

    2. to型的for循环:

      for(i <- start to end)

    3. 增强的for循环——遍历集合或者数组:

      for(elem <- 集合/数组的变量)

    4. for循环的步长(迭代,默认情况下迭代+1):

      for(i <- start until|to end by num)

    5. 循环守卫(满足某个条件再执行循环体):

      for(i <- start until|to end 【by num】 if 语句)

    6. 多重循环:

      for(i <- start until|to end by num 循环守卫 ;j<- start until|to end by num 循环守卫)

    7. 循环的返回值问题(将循环的值赋予给一个Scala集合):

      var array = for(i <- start until|to end by num 循环守卫) yield i

  2. while循环

  3. do while循环

    2~3:和Java语法是一模一样的

四、Scala的函数式编程

4.1 函数的基本语法

def 函数名(形参列表):函数的返回值类型={ 函数体 }

4.2 函数的形参列表问题

  1. 可变长形参 参数名:数据类型*,一个函数只能有一个可变长形参,而且形参必须位于函数形参列表的末尾

  2. 形参的默认值,Scala函数当中,形参是可以赋予默认值的,一旦形参赋予默认值,那么调用参数的时候,带有默认值的形参就可以不用传递参数了,带有默认值的形参一般要求放到形参列表的最后,如果没有放到最后,那么调用的时候,给其他形参传递参数,需要带有参数名传递

    def test(name:String=zs,age:int){}

    test(age=1)--具名实参

4.3 函数的返回值问题

【注意】函数有两种特殊的返回值:Unit、Nothing

4.4 函数的高阶函数

【注】在Scala中,函数是一等公民,函数可以在Scala的任何位置充当任何的角色,函数可以声明在类中,也可以声明在函数中,还可以声明在参数列表中、还可以当作返回值,还可以当作一个变量

4.4.1 函数当变量使用:把函数重命名了

var d:函数的定义 = 函数名 _

【注意】函数的类型如何声明: (形参类型列表) => 返回值类型

示例:

函数的定义:

def test(a:Int,b:Int):Int={a+b}

函数的类型写法:

(Int,Int) => Int

4.4.2 函数当参数来使用

语法:

def test(a:Int,f:(Int,Int)=>Int):Unit={ }

4.4.3 函数当作返回值来使用

语法:

def test():(Int,Int)=>Int={ }

4.4.2~4.4.3 :Scala中存在匿名函数,专门使用在这两个场景

4.5 函数的高级使用

4.5.1 函数的闭包问题

函数闭包指的是将不属于本函数的变量或者对象也包含进来,直到该函数运行完成,外部变量或者对象才可以被释放。

var x:Int = 1 def test(a:Int):Int={ a*x }

4.5.2 函数的柯里化

将一个接受多个参数的函数给他转换成为一个接受单个参数的函数的过程

将一个接受多个参数的函数转换成为一个返回了函数的函数,返回的函数传递的值就是原先的第二个参数

其实闭包的一个使用场景

4.5.3 递归函数

  1. 函数内部调用本函数

  2. 递归三要素

    1. 递归入口:自己调用自己的的逻辑
    2. 递归出口:不能调用自己的逻辑
    3. 递归条件必须向出口迭代

4.5.4 函数的惰性加载

惰性加载指的是将函数的调用延迟到第一次使用函数的返回值的时候才会调用

使用语法: lazy val 变量名 = 函数名(实参)

此时函数的调用在第一次使用变量的时候才会调用 一旦惰性加载,变量名只能使用val修饰

4.6 函数的简化操作

4.6.1 声明的简化

  1. 如果函数没有参数,那么函数的括号可以省略 def test:Unit={}

  2. 函数的返回值可以省略的,可以根据函数体的最后一行自动推断,

    【注意】如果函数体的最后一行使用return 关键字返回数据,那么函数的返回值一定不能省略def test = { 1 }

  3. 函数体中,函数的返回值前的return关键字可以省略的,自动根据最后一行推断函数的返回值

  4. 如果函数的返回值类型是 Unit类型 那么 =号和函数 的返回值都可以省略 def test{}

  5. 匿名函数

    1. 定义:定义函数时,只关注函数的逻辑,不关注函数的名字,此时我们就可以使用匿名函数来定义函数: (形参列表) => {函数体}
    2. 使用场景:当函数当作参数或者当作返回值使用的时候,可以使用匿名函数传递
    3. 简化
      1. 匿名函数的形参列表的类型可以省略的,因为当作参数或者返回值使用的时候,参数的类型定义死了
      2. 如果匿名函数的函数体只有一个,那么 {} 可以省略了
      3. 如果形参的参数名在函数体中只出现了一次,那么参数名就可以使用 _ 替代,同时形参列表可以省略了

4.6.2 调用的简化:一般不建议使用,建议运算符的函数调用简化

调用的语法对象名|类名.函数名(实参列表)

  1. 调用的点.可以省略的,对象名|类名 函数名(实参列表)
  2. 如果实参列表为空,那么 () 可以省略,如果声明函数的时候没有加 () 那么调用的时候一定不能加 ()
  3. 如果函数的实参列表只有一个 那么 () 也可以省略 对象名|类名 函数名 唯一的实参

五、 Scala中面向对象

Scala源于Java中,因此在Scala中也存在面向对象编程思想,面向对象编程最核心的逻辑就是以类来组织代码,以对象来调用代码。Scala的面向对象和Java基本上思维是一致的,只不过就是语法稍微不一样而已。

5.1 包和import导入

包package:包是用来分类管理Scala代码的,将不同类型的代码放到不同的包下,便于我们管理

5.1.1 Scala包有两种管理代码的方式

  1. 采用和Java一样的管理机制,新建包,包下可以新建类和子包

  2. 采用包对象的管理机制,实现一个文件中存在多个包和多个scala类

5.1.2 Scala中类的导入问题import

在当前Scala类中,如果要使用非本包下的代码,那么我们就得需要通过import关键字导入才能使用。

  1. 每一个Scala类默认导入三个包

    1. java.lang.
    2. _scala._
    3. scala.Predef._
  2. Scala类中导入有一些规则和Java有点不一样

    1. Scala可以在任何位置进行导包操作,代码只能在导包位置之后使用 我们可以把所有的包放到package之后 class之前

    2. 如果我们要导入一个包下的所有代码,那么可以使用_当作通配符使用

    3. 我们现在只想导入某一个包下的两个类,而非所有类 import xxxx.{x1,x2}

    4. 导包重命名操作:可以将一个类重命名为另外一个名字在当前类中使用

      import xxxx.{x1=>x2} x1类在当前类中可以使用x2名字来替代

    5. 屏蔽某一个包下的部分类:导入一个包下的所有代码,除了某几个类之外

      import xxxx{x1=>_,x2} 导入xxxx包下的x2类,不导入x1这个类

5.2 面向对象中的类

5.2.1 类的定义

访问控制修饰符 class 类名(主构造器){ 类体 }

5.2.2 访问控制符

三个 private protected public–不写

在同一个Scala文件中可以存在多个Scala类,权限没要求的

5.3 面向对象中类的属性

5.3.1 属性

属性用来描述类的特征

5.3.2 声明语法

访问控制修饰符 var|val 属性名:属性类型 = 值;

属性声明的时候必须加值,但是我不想给其他值,只想给默认值,那么值使用**_** 来代替

【注意】

val修饰的属性 不能赋予 _ 默认值,必须给一个显示的值

属性前加一个注解@BeanProperty

5.4 面向对象中类的方法

5.4.1 方法

方法就是函数,函数声明在类中,函数称之为方法

5.4.2 语法

访问控制修饰符 def 方法名(形参列表):方法的返回值类型 ={ 方法体 }

5.5 面向对象中类的代码块和内部类

{} 类中类

5.6 面向对象中类的构造器

5.6.1 构造器是创建该类的实例对象的

  1. Scala有两种构造器
    1. 主构造器:声明在类上的 class ClassName 访问控制修饰符 (形参列表)--主构造器
    2. 辅助构造器:声明在类中的构造器,语法: def this(形参列表){ }
    3. 辅助构造器必须在首行直接或者间接的调用主构造器代码

【注意】

主构造器不存在构造体,那么也就意味着主构造器无法给属性赋值,为了可以给属性赋值,主构造器的形参列表有个变化,主构造器的形参列表可以使用var或者val修饰,一旦主构造器的形参使用var val修饰 那么主构造器中的形参就是类的属性了

主构造器我们一般都是要求是无参构造器,而且主构造器一旦是无参的,那么主构造器的()可以省略

六、Scala中集合

七、Scala中的隐式转换

八、Scala中_的作用

  1. _在模式匹配中,_代表的是未匹配到其他情况,默认情况
  2. 函数名 _ : _ 代表的是将函数当作一个整体来使用,而非调用函数

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

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

相关文章

【数据结构】堆排序详解

文章目录 一、堆排序思想二、向上调整建堆排序三、向下调整建堆排序四、总结 对于什么是堆&#xff0c;堆的概念分类以及堆的向上和向下两种调整算法可见&#xff1a; 堆的创建 一、堆排序思想 int a[] { 2,3,5,7,4,6 };对于这样一个数组来说&#xff0c;要想要用堆排序对它…

java.lang.ClassCastException: android.os.BinderProxy cannot be cast to ...

项目开发遇到下面这个报错了&#xff01; 问题原因 直接说原因&#xff0c;就是因为进程间不能直接传递对象&#xff0c;应该传递该Binder对象的映射&#xff08;代理对象&#xff09;&#xff0c;所以类型转换就出错了。如果在同一个进程中&#xff0c;直接传递对象没有关系&a…

9月15日作业

Qt代码 #include "mywnd.h"//构造函数的定义 mywnd::mywnd(QWidget *parent): QWidget(parent) //显性调用父类的有参构造完成对子类从父类继承下来成员的初始化工作 {//窗口设置this->resize(QSize(500, 433));this->setWindowTitle("Widget&quo…

linux 应用中offsetof ()是个啥?

#include <stdio.h> #include <stddef.h> // 需要包含 <stddef.h> 否则会有以下错误, 是因为找不到offsetof()而引起 // printf("age offset:%d\n",offsetof(Persion,age)); //main.cpp|11 col 43| error: expected primary-expression before …

安装GPU驱动,CUDA Toolkit和配置与CUDA对应的Pytorch

如果有帮助,记得回来点个赞 目录 1.安装指定GPU驱动如果安装的GPU CUDA Version和CUDA Toolkit版本已经冲突怎么办? 2.安装指定版本的CUDA Toolkit如果我安装了CUDA Toolkit之后nvcc -V仍然显示旧的CUDA Toolkit版本怎么办? 3.安装与CUDA对应的Pytorch已经安装了错乱版本的c…

《C++ primer plus》精炼(OOP部分)——对象和类(4)

“学习是人类进步的阶梯&#xff0c;也是个人成功的基石。” - 罗伯特肯尼迪 文章目录 友元函数利用友元函数重载<<运算符重载部分示例&#xff1a;矢量类 友元函数 先看看在上一章中我们作为例子的代码&#xff1a; class Student{string name;int grade;int operator…

第十九章、【Linux】开机流程、模块管理与Loader

19.1.1 开机流程一览 以个人计算机架设的 Linux 主机为例&#xff0c;当你按下电源按键后计算机硬件会主动的读取 BIOS 或 UEFI BIOS 来载入硬件信息及进行硬件系统的自我测试&#xff0c; 之后系统会主动的去读取第一个可开机的设备 &#xff08;由 BIOS 设置的&#xff09; …

Android NDK 中有导出 sp智能指针吗?如果没有,可以用什么方法代替 android::sp 智能指针

Android NDK 中有导出 sp智能指针吗&#xff1f;如果没有&#xff0c;可以用什么方法代替 android::sp 智能指针 Author: Lycan Note: 以下问题解答通过大模型生成&#xff0c;主要用于个人学习和备忘&#xff0c;仅供参考&#xff0c;若有错误或者侵权&#xff0c;请联系我修…

如何实现wingftpserver部署到外网访问?快解析p2p内网穿透

不少朋友选择用wing FTP来搭建部署FTP服务管理文件共享。Wing FTP Server是一个跨平台ftp服务器端&#xff0c;它有不错的可靠性和一个友好的配置界面&#xff0c;Wing FTP Server除了能提供FTP的基本服务功能以外&#xff0c;还能提供管理员终端、任务计划、基于Web的管理端和…

中国智能客服发展历程

中国智能客服的发展历程&#xff1a; 在2000年以前&#xff0c;互联网尚未普及&#xff0c;客服主要以电话沟通为主。从2000年到2010年&#xff0c;得益于计算机技术、计算机电话集成技术&#xff08;CTI&#xff09;、网络技术、多媒体机技术以及CRM、BI、ERP、OA等企业信息化…

基于SSM+Vue的校园教务系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

AK 9.12 百度Java后端研发B卷 笔试

T1(博弈论) #include <bits/stdc.h>#define endl \nusing namespace std;typedef long long LL;const int N 1e5 10;int n, m, t;void solve() {cin >> n >> m; t n m - 2;if(t & 1) cout << "Yes" << endl;else cout <&l…

MATLAB入门-字符串操作

MATLAB入门-字符串操作 注&#xff1a;本篇文章是学习笔记&#xff0c;课程链接是&#xff1a;link MATLAB中的字符串特性&#xff1a; 无论是字符还是字符串&#xff0c;都要使用单引号来‘’表示&#xff1b;在MATLAB中&#xff0c;字符都是在矩阵中存储的&#xff0c;无论…

Leetcode: 645.错误的集合 题解【超详细】

题目 集合 s 包含从 1 到 n 的整数。不幸的是&#xff0c;因为数据错误&#xff0c;导致集合里面某一个数字复制了成了集合里面的另外一个数字的值&#xff0c;导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了集合 S 发生错误后的结果。 请你找出重复…

在WinForms应用程序中创建一个定时任务以监听鼠标左键点击事件可以通过以下步骤实现

在WinForms应用程序中创建一个定时任务以监听鼠标左键点击事件可以通过以下步骤实现&#xff1a; 1. 打开您的WinForms应用程序或创建一个新的WinForms项目。 2. 在窗体上添加一个Timer控件&#xff0c;用于定时检查鼠标左键点击事件。 3. 在窗体的构造函数或Load事件处理程…

新手如何开始Microstation CE版二次开发

一步步学习MicroStation CE MDL&#xff08;C&#xff09;开发 - 技术资料库 - Bentley 中国优先社区 - Bentley Communities https://communities.bentley.com/communities/other_communities/chinafirst/w/chinawiki/57704/microstation-ce-mdl-c一步步学习MicroStation CE A…

VS2022 开发.net 4.0的方法

原文连接&#xff08;如果安装.net 4.0 把文中的4.5改为4.0即可&#xff09; Visual Studio 2022 如何安装低版本的 .Net Framework - 一颗路边小石头 - 博客园 (cnblogs.com)

代码随想录二刷day29

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣491. 递增子序列二、力扣47. 全排列 II三、力扣46. 全排列 前言 一、力扣491. 递增子序列 class Solution {List<List<Integer>> res ne…

算法:合并两个有序数组---双指针[1]

文章来源&#xff1a; https://blog.csdn.net/weixin_45630258/article/details/132673462 欢迎各位大佬指点、三连 1、题目&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元…

java关于文件记录篇章之文件夹创建篇

今天&#xff0c;创建一个文件夹目录的时候&#xff0c;创建多级目录的时候发现&#xff0c;自己老是创建失败&#xff0c;但是系统显示文件夹创建成功&#xff0c;但是你去找文件夹的时候&#xff0c;又发现创建失败&#xff0c;这里在我成功之后封装了一个创建文件夹的创建对…