Scala精华之处就在这里,拿去,面试也不怕

Scala基础知识总结 scala是运行在JVM上的多范式编程语言,同时支持面向对象和面向函数编程。早期,scala刚出现的时候,并没有怎么引起重视,随着Spark和Kafka这样基于scala的大数据框架的兴起,scala逐步进入大数据开发者的眼帘。scala的主要优势是它的表达性。 Scala语言主要用于开发大数据应用程序,如:Spark程序、Flink程序;它具有表达能力强,一行代码抵得上多行java代码,开发速度快;它也兼容Java,可以访问庞大的Java类库,例如:操作mysql、redis、freemarker、act 阅读详情

在这里插入图片描述

关注【大数据左右手】加技术吐槽群,获取更多资料

前言

Scala作为一门面向对象的函数式编程语言,把面向对象编程与函数式编程结合起来,使得代码更简洁高效易于理解。这就是Scala得到青睐的初衷。

Scala作为一门JVM的语言,大数据生态的大部分组件都是Java语言开发的,而Scala可以与Java无缝混编,因此可以很好地融合到大数据生态圈。

主要内容

一些基础东西不再罗列,比如开发环境,循环,异常,泛型等等,本篇只介绍特殊的地方,注重概念理解与用法。

  1. 变量和数据类型
  2. 函数式编程
  • 高阶函数
  • 匿名函数
  • 闭包
  • 函数柯里化
  1. 面向对象
  • 类与对象
  • 伴生对象
  • 特质
  1. 模式匹配
  2. 隐式转换

变量和数据类型

变量(var声明变量,val声明常量)

var 修饰的变量可改变

val 修饰的变量不可改变

但真的如此吗?

对于以下的定义
class A(a: Int) {
  var value = a
}

class B(b: Int) {
  val value = new A(b)
}

效果测试
val x = new B(1)

x = new B(1) // 错误,因为 x 为 val 修饰的,引用不可改变
x.value = new A(1) // 错误,因为 x.value 为 val 修饰的,引用不可改变

x.value.value = 1 // 正确,x.value.value 为var 修饰的,可以重新赋值

事实上,var 修饰的对象引用可以改变,val 修饰的则不可改变,但对象的状态却是可以改变的。

可变与不可变的理解

我们知道scala中的List是不可变的,Map是可变和不可变的。观察下面的例子

var可变和List不可变的组合
var list = List("左","右")

list += "手"
理解就是

var list指向的对象是 List(“左”,“右”)

后面修改list的指向,因为是可变的var修饰,list又可以指向新的 List(“左”,“右”,“手”)

如果是以下(会报错的)

val list = List("左","右")

list += "手"
val var与Map可变和不可变
var map = Map(
      "左" -> 1,
      "右" ->1,
    )
map+=("手"->1)
val map=scala.collection.mutable.Map(
  "左" -> 1,
  "右" ->1,
)

map+=("手"->1)
理解

不可变的Map在添加元素的时候,原来的Map不变,生成一个新的Map来保存原来的map+添加的元素。

可变的Map在添加元素的时候,并不用新生成一个Map,而是直接将元素添加到原来的Map中。

val不可变的只是指针,跟对象map没有关系。

数据类型

在这里插入图片描述

数据类型描述
Byte8位有符号补码整数。数值区间为 -128 到 127
Short16位有符号补码整数。数值区间为 -32768 到 32767
Int32位有符号补码整数。数值区间为 -2147483648 到 2147483647
Long64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807
Float32 位, IEEE 754 标准的单精度浮点数
Double64 位 IEEE 754 标准的双精度浮点数
Char16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF
String字符序列
Booleantrue或false
Unit表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。
Nullnull 或空引用
NothingNothing类型在Scala的类层级的最底端;它是任何其他类型的子类型。
AnyAny是所有其他类的超类
AnyRefAnyRef类是Scala里所有引用类(reference class)的基类

函数式编程

高阶函数

高阶函数是指使用其他函数作为参数、或者返回一个函数作为结果的函数。在Scala中函数是"一等公民"。

简单例子
val list=List(1,2,3,4)

val function= (x:Int) => x*2

val value=list.map(function)

方法为函数

def main(args: Array[String]): Unit = {
    val list=List(1,2,3,4)
    val value=list.map(function)
}

def function   (x:Int)=x*2
返回函数的函数
def calculate(symbol:String): (String,String)=>String ={
    symbol match {
      case "拼接方式1" => (a:String,b:String)=> s"拼接方式1:$a , $b"
      case "拼接方式2" => (a:String,b:String)=> s"拼接方式2: $b , $a"
    }
  }
val function: (String, String) => String = calculate("拼接方式2")

println(function("大数据", "左右手"))
匿名函数

Scala 中定义匿名函数的语法很简单,箭头左边是参数列表,右边是函数体。

使用匿名函数后,我们的代码变得更简洁了。

var inc = (x:Int) => x+1

var x = inc(7)-1

也可无参数

var user = () => println("大数据左右手") 
闭包

闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。

闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数。

简单理解就是:函数内部的变量不在其作用于时,仍然可以从外部进行访问。

val function= (x:Int) => x*2

闭包的实质就是代码与用到的非局部变量的混合

闭包 = 代码 + 用到的非局部变量

val fact=2
val function= (x:Int) => x*fact
函数柯里化

柯里化指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。

先定义一个简单的
def add(x:Int,y:Int)=x+y

使用

add(1,2)
函数变形(这种方式就叫柯里化)
def add(x:Int)(y:Int) = x + y

使用

add(1)(2)
实现过程

add(1)(2) 实际上是依次调用两个普通函数(非柯里化函数)

第一次调用使用一个参数 x,返回一个函数类型的值。

第二次使用参数y调用这个函数类型的值。

接收一个x为参数,返回一个匿名函数

接收一个Int型参数y,函数体为x+y。

def add(x:Int)=(y:Int)=>x+y

(1)
val result = add(1)  // result= (y:Int)=>1+y

(2)
val sum = result(2)

(3)
sum=3


面向对象

类和对象

类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。

类可以带有类参数

类参数可以直接在类的主体中使用。类参数同样可以使用var作前缀,还可以使用private、protected、override修饰。scala编译器会收集类参数并创造出带同样的参数的类的主构造器。,并将类内部任何既不是字段也不是方法定义的代码编译至主构造器中。

class Test(val a: Int, val b: Int) {
    // 
}
样例类

case class一般被翻译成样例类,它是一种特殊的类,能够被优化以用于模式匹配。

当一个类被声名为case class的时候。具有以下功能:

  1. 构造器中的参数如果不被声明为var的话,它默认的是val类型的。
  2. 自动创建伴生对象,同时在里面给我们实现子apply方法,使我们在使用的时候可以不直接使用new创建对象。
  3. 伴生对象中同样会帮我们实现unapply方法,从而可以将case class应用于模式匹配。
  4. 实现自己的toString、hashCode、copy、equals方法
case class person(
    name:String,
    age:Int
)
对象与伴生对象

Scala单例对象是十分重要的,没有像在Java一样,有静态类、静态成员、静态方法,但是Scala提供了object对象,这个object对象类似于Java的静态类,它的成员、它的方法都默认是静态的。

定义单例对象并不代表定义了类,因此你不可以使用它来new对象。当单例对象与某个类共享同一个名称时,它就被称为这个类的伴生对象。

类和它的伴生对象必须定义在同一个源文件里。类被称为这个单例对象的伴生类。

类和它的伴生对象可以互相访问其私有成员。

object Test {
  private var name="大数据"

  def main(args: Array[String]): Unit = {
    val test = new Test()
    println(test.update_name())
  }
}

class Test{
  def update_name(): String ={
    Test.name="左右手"
    Test.name
  }

}
特质(trait)

scala trait相当于java 的接口,实际上它比接口还功能强大。
与接口不同的是,它还可以定义属性和方法的实现。

一般情况下scala的类只能够继承单一父类,但是如果是trait 的话就可以继承多个,从结果来看就是实现了多重继承(关键字with)。其实scala trait更像java的抽象类。

object Test extends UserImp with AddressImp {
  override def getUserName(): String = ???

  override def getAddress(): String = ???
}

trait UserImp{
  def getUserName():String 
}

trait AddressImp{
  def getAddress():String
}

模式匹配

以java 的 switch 为例,java 的 switch 仅仅会做一些基本类型的匹配,然后执行一些动作,并且是没有返回值的。

而 scala 的 pattern matching match 则要强大得多,除了可以匹配数值,同时它还能匹配类型。

def calculate(symbol:String): (String,String)=>String ={
    symbol match {
      case "拼接方式1" => (a:String,b:String)=> s"拼接方式1:$a , $b"
      case "拼接方式2" => (a:String,b:String)=> s"拼接方式2: $b , $a"
    }
  }
让我吃惊的是(就短短几行)
快排

def quickSort(list: List[Int]): List[Int] = list match {
    case Nil => Nil
    case List() => List()
    case head :: tail =>
      val (left, right) = tail.partition(_ < head)
      quickSort(left) ::: head :: quickSort(right)
  }
  
归并

def merge(left: List[Int], right: List[Int]): List[Int] = (left, right) match {
    case (Nil, _) => right
    case (_, Nil) => left
    case (x :: xTail, y :: yTail) =>
      if (x <= y) x :: merge(xTail, right)
      else y :: merge(left, yTail)
}


隐式转换

Scala提供的隐式转换和隐式参数功能,是非常有特色的功能。是Java等编程语言所没有的功能。它可以允许你手动指定,将某种类型的对象转换成其他类型的对象。通过这些功能,可以实现非常强大,而且特殊的功能。

规则

(1)在使用隐式转换之前,需要用import把隐式转换引用到当前的作用域里或者就在作用域里定义隐式转换。

(2)隐式转换只能在无其他可用转换的前提下才能操作。如果在同一作用域里,对同一源类型定义一个以上的隐式转换函数,如果多种隐式转换函数都可以匹配,那么编译器将报错,所以在使用时请移除不必要的隐式定义。

数据类型的隐式转换

String类型是不能自动转换为Int类型的,所以当给一个Int类型的变量或常量赋予String类型的值时编译器将报错。但是…

  implicit def strToInt(str: String) = str.toInt
  def main(args: Array[String]): Unit = {
    val a:Int="100"
    
    print(a)
  }
参数的隐式转换

所谓的隐式参数,指的是在函数或者方法中,定义一个用implicit修饰的参数,此时Scala会尝试找到一个指定类型的,用implicit修饰的对象,即隐式值,并注入参数。

object Test {
  private var name="大数据"
  implicit val test = new Test

  def getName(implicit test:Test): Unit ={
    println(test.update_name())
  }
  def main(args: Array[String]): Unit = {
    getName
  }
}

class Test{
  def update_name(): String ={
    Test.name="左右手"
    Test.name
  }

}

在这里插入图片描述

《大数据最全面试题-Offer直通车》目录 做好这些不用担心试用期不通过:程序员入职新公司如何快速上手项目本人遇到大数据面试题和参考答案(超过1万字精华版)大数据面试英文自我介绍参考(万字长文)大数据运维应用场景面试题汇总及参考答案(持续更新)万字数据仓库面试题及参考答案数据仓库数据质量监控和处理方法最佳实践数据仓库建模方法万字详解Doris的3种数据模型详解和数据仓库每一层的模型选用大数据面试临阵磨枪不知看什么?看这份心理就有底了-大数据常用技术栈常见面试100道题最全Hive面试题2024年(2万字详解)Elasticsearch 面试题及参考答 阅读详情

相关推荐

scala 详细总结

scala 详细总结,很多页面的。 scala 详细总结,很多页面的。

scala简介 (一)

1.Scala 是 Scalable Language 的简写,是一门多范式的编程语言。 (注:多范式,就是多种编程方法的意思。有哪些编程方法呢?目前说来,有面向过程,面向对象,泛型,函数式四种程序设计方法。) 2.联邦理工学院洛桑(EPFL)的Martin Odersky于2001年基于Funnel的工作开始设计Scala。 (注:Martin是EPFL(瑞士领先的技术大学)编程研究组的教授。他...

weixin_45012009的博客 427

SCALA详细总结SCALA详细总结

SCALA详细总结

Scala 知识点总结大全

一、变量、数据类型、运算符 1.1语法声明 变量的类型在变量名之后等号之前声明。 var | val 变量名 :变量类型 = 变量值 变量的类型如果能够通过变量值推断出来,那么可以省略类型声明 1.2 变量初始化 Scala语法中,必须显示进行初始化操作。 1.3 可变变量& 不可变变量 值可以改变的变量,称之为可变变量,但是变量类型无法发生改变, Scala中可变变量使用关键字var进行声明 ​ 值一旦初始化后无法改变的变量,称之为不可变变量。Scala中不可变变量使用关键字va

yang灬仔 1812

scala详细总结

此篇文档总结的是scala的开发语言技术,总结的非常的全面!@

Scala详细总结(精辟版++)

学习scala时总结的scala笔记,非常全面和详细,希望能够帮助到大家。

Scala基础知识(个人总结)

    声明: 1. 本文为我的个人复习总结, 并非那种从零基础开始普及知识 内容详细全面, 言辞官方的文章               2. 由于是个人总结, 所以用最精简的话语来写文章            

hellosrc的博客 9761

深入解析6T SRAM的读写机制与性能优化

本文深入解析了6T SRAM的基本结构与核心工作原理,详细阐述了其读写操作的具体时序与机制。文章重点探讨了在先进工艺下面临的读写稳定性、写入能力等性能挑战,并系统介绍了写入辅助与读取辅助等关键优化技术,旨在提升SRAM的可靠性与整体性能。

weixin_29205061的博客 1227

一, Scala基础语法全总结

一, 简单入门 1.1 为什么要学习Scala? Java的扩展和延伸 Scala基于JVM, 和Java完全兼容, 同样具有跨平台,可以执行好,方便的垃圾回收等特性; Scala是一种纯粹的面向对象语言; Scala是一门函数式编程语言; Scala更适合大数据的处理 Scala对集合类型数据处理有非常好的支持 Sparkd的底层用Scla编写 1.2 Scala 与 Java, JVM的关系 1.3 Scala语言的特点 1.4 Scala 安装和IDE的配置 安装和配置环境变

菜菜的大数据开发の路 2742

配置oem 13c以监控管理数据库

使用oem13c监控数据库

雅冰石的专栏 1812

BERT + BiLSTM-CRF 处理流程

BERT是一个基于 Transformer 的预训练语言模型。与传统的语言模型不同,BERT 是双向的,即它同时利用上下文信息进行词表示学习。BERT 在大规模语料库上进行预训练,可以捕捉到深层次的语言知识和上下文关系,生成非常丰富的词向量表示。在序列标注任务中,BERT 被用作输入文本的编码器,将每个词映射为上下文相关的词嵌入(embeddings)。

AI Agent 首席体验官 2258

2018 大数据面试

大数据工程师(开发)面试 1.HBase和Hive都是基于Hadoop,为什么Hive查询起来非常慢,但HBase不是? Hive是类SQL引擎,其查询都需要遍历整张表,跑MapReduce自然很慢,但HBase是一种NoSQL的列式数据库,基于Key/Value的存储格式,不需要像Hive一样遍历,自然在速度上,乃至写的性能上是相当之快的。 相关参考文献 HIVE和HBASE区别 2.通过Jav...

Simple 专栏 4365

实战指南:在华为防火墙上构建基于自签CA的SSL证书挑战式认证体系

本文详细介绍了在华为防火墙上构建基于自签CA的SSL证书挑战式认证体系的实战指南。通过自签CA证书生成、华为防火墙SSL VPN配置、客户端安装与测试等步骤,帮助企业实现更安全的远程办公接入方案,有效防范密码泄露风险。文章重点讲解了证书挑战登录的实现原理和配置细节,适用于企业网络安全建设。

weixin_32428571的博客 257

2018最新大数据面试题下载

  人生的每一个阶段,都有自己应该做的事情,我们在大数据时代,该学习大数据技术就应该好好学习大数据技术,将自己的技术学到精深,学到大数据技术的精华。该面试找工作的时候,也要做好一切准备,无论是礼仪的学习、说话的技巧还是大数据的面试题也是要面面俱到的。恰巧小编整理了一份大数据面试题,供你们免费下载。    1. scala 隐函数关键字  implicit  2. val x=y=1结果  1)x、...

xx666zz的博客 1983

【汽车主动降噪】【ANC算法优化】基于深度学习的汽车主动噪声控制技术研究及Matlab实现

本文探讨了基于深度学习的汽车主动降噪(ANC)算法优化方案。针对传统FXLMS算法在应对复杂、非线性车内噪声时的局限性,文章详细解析了如何利用神经网络作为非线性建模器、深度滤波器或智能步长调节器来增强ANC系统性能,并提供了完整的Matlab仿真实战流程,展示了深度学习在提升降噪效果和收敛速度方面的潜力。

seed的博客 540

Coze实战:解锁多Bot协同与条件分支工作流的奥秘

本文详细介绍了在字节跳动Coze平台实现多Bot协同与条件分支工作流的方法。首先阐述了Coze平台的功能优势,包括丰富的插件、知识库和工作流功能。随后分步骤讲解了多Bot协同的实现:从准备工作、创建Bot到协同配置,并提供了电商客服的实例演示。在条件分支工作流部分,详细说明了条件节点的作用类型、条件设定方法以及具体配置操作,强调测试优化的重要性。最后通过电商平台综合案例,展示了多Bot协同与条件分支的实际应用效果,并针对常见问题提供解决方案。文章为开发者在Coze平台上构建智能应用提供了实用指导,有助于提升

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 450

大数据培训 | Scala语言知识分享,直击面试

类参数可以直接在类的主体中使用。类参数同样可以使用var作前缀,还可以使用private、protected、override修饰。scala编译器会收集类参数并创造出带同样的参数的类的主构造器。,并将类内部任何既不是字段也不是方法定义的代码编译至主构造器中_大数据培训。...

weixin_45695430的博客 222

锂电池的充电和放电曲线解读

锂电池充放电曲线是反映其性能的关键指标。充电曲线分为恒流和恒压两阶段:恒流阶段电压快速上升,恒压阶段电流逐渐降低;放电曲线则呈现平台期和快速衰减期特征。这些曲线受温度、充放电倍率及材料体系(如三元锂或磷酸铁锂)显著影响。通过分析曲线特征,可优化电池管理系统,实现精准的SOC估算、快充策略制定及故障诊断,从而在电池性能与安全性间取得平衡。不同应用场景(如新能源汽车或消费电子)对曲线形态有特定要求。

start_up_go的博客 5073

关于Spark的面试题,你应该知道这些!

关于Spark的面试题,你应该知道这些!

大数据梦想家 6503

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

spark面试题(觉得不错麻烦点个赞2020)

spark面试题一 1、spark的有几种部署模式,每种模式特点?(☆☆☆☆☆) 1)本地模式 ​ Spark不一定非要跑在hadoop集群,可以在本地,起多个线程的方式来指定。将Spark应用以多线程的方式直接运行在本地,一般都是为了方便调试,本地模式分三类 ​ local:只启动一个executor ​ local[k]:启动k个executor ​ local[*]:启动跟cpu数目相同的 executor 2)standalone模式 ​ 分布式部署集群,自带完整的服务

q2829867636的博客 665

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

hadoop+spark生态系统操作与指南非影印版_【面试妥了】史上最全Spark面试题

戳蓝字“优快云云计算”关注我们哦!作者 |游骑小兵责编 | 阿秃Spark问题精华Q:什么是Spark?A:简单理解,Spark是在Hadoop基础上的改进,是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapRe...

weixin_39593061的博客 439

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java零基础到入门:从环境搭建到算法面试的完整学习路径

面向对象编程(OOP)是构建复杂软件系统的核心范式,其通过封装、继承和多态三大特性,将数据和操作封装成对象,从而提升代码的可维护性、复用性和扩展性。在Java语言中,OOP不仅是语法基础,更是其跨平台、高性能特性的重要支撑,广泛应用于后端服务、大数据处理等企业级场景。理解OOP原理是掌握Java开发的关键,也是应对力扣算法题和大厂面试八股文的技术基石。本文以Java零基础学习为切入点,系统梳理从环境搭建、核心语法到算法实战的连贯路径,帮助初学者构建扎实的面向对象思维和工程实践能力。

weixin_30896825的博客 327

好用工具及社区推荐

好用的工具推荐: 网页画图工具(强大的画图工具,提供多种类型的图片设计) MarkDown工具(提供在线网页和离线软件);有道云笔记也支持创建markdown文件,也是超级好用的额,主要是支持控件的即点即用,适用于不熟悉.md文件的man。.md文件支持HTML的等,所以会前端的那就是小菜一碟咯。 远程连接工具Xshell和Xftp(提供远程连接和文件传输) JAVA,SCALA 语言开发工具(...

会写Bug的攻城狮 436

嵌入式开发实战:从面试题解析到项目落地(C/Linux/ARM篇)

本文以嵌入式开发实战为核心,通过解析经典面试题,系统阐述了C语言、Linux系统和ARM架构三大核心要素在真实项目中的应用。文章结合驱动开发、内存管理、进程通信等场景,将理论知识转化为解决实际问题的能力,旨在帮助工程师跨越从理论到实践的鸿沟,实现项目落地。

e4f5g6h的博客 382
上一篇: Hadoop学习与面试8000字,收藏这一篇就够了
下一篇: 10万字大数据框架面试知识点大整理,你还不拿去吗?
大数据左右手
博客等级 码龄9年 475粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值