kafka01

Scala简介

Scala是将面向对象和函数式编程结合在一起的语言,Scala的任务主要基于JVM基础之上,同时Scala语言是基于 Java语言开发的。

应用:Spark、Kafka

作者:马丁 奥德斯基

发行时间:2004年推出第一版Scala,然后在2009推出的2.X版本

学习Scala的目的:

比较简单:这个框架开发比较简单,而且相对于Java来说,代码少之又少,开发敏捷。

运行速度快:Scala语言表达能力强,一行相当于Java的多行代码,开发比较快,Scala是静态编译的语言。

可以整合Hadoop生态:能融入Hadoop生态,然后可以使用基于Scala的Spark技术栈,进行Hadoop内的操作,主要还是能无缝对接HDFS。

特点:它是一门多范式,命令行式编程语言,实现面向对象编程和函数式编程的语言,但是Scala还是要基于JVM基础之上,实现代码的开发。

Scala解释器

  1. REPL:Read(取值)->Evaluation(求值)->Print(打印)->Loop(循环)

  2. 声明变量两种方式:val 声明的变量是不可变的变量,但是可以调用的使用 var 声明变量是可变变量,并且可以进行调用,在这里官网给我们定义,在声明变量的时候,尽量使用val进行声明,因为我们声明的变量会被调用或者使用,那么在传输(网络)过程中,会发生序列化和反序列化操作,那么有可能会发生数据值被传错的情况,所以尽量用val声明变量。
    val和var的区别

    1、内容是否不变

    2、val修饰的变量在编译后,等同于加上final

    3、是否可以有lazy修饰.val修饰的变量还可以用lazy修饰

  3. 定义类型时,如果不确定,或者不想写死一个类型可以定义为他们的顶级父类,Any类型

  4. 数据类型和操作符

    基本数据类型:Byte、Char、Short、Int、Long、Float、Double、Boolean,在scala中也有java的基本数据类型,但是没有java的包装类型

    Scala内部提供了一些加强版类型RichInt,RichDouble、RichChar等类型

    to方法其实在Int内部是没有这样的方法的,是在他的加强类中RichInt中才有的方法

    操作符:和Java类似,比如+、-、*、/、%以及&,其中有一点要注意,在java中如果进行自增的话,你需要写++,但是在scala中是+=具体值,比如count += 1

  5. apply函数(初始化函数)

    这个apply函数其实相当于我们在定义一些类的时候,有的类需要new,才能创建,但是在scala编程当中,为了简化使用者的难度,有一些操作,是在内部进行初始化了,相当于说,使用者不需要再去new 类或者对象,而且直接调用,例如“ new 类名() ” 在Scala中直接 " 类名()"

  6. if表达式

    if表达式的定义:在Scala中,if表达式是有值的,就是if或者else中最后一行语句代表返回值

    在条件语句中进行判断的话,那么如果出现返回值不统一的情况下,将取他们的公共父类,进行返回,如果当前if表达式中没有else语句那么就代表else是空值,返回的类型也同样是他们的公共父类,在这里Unit和() 一个意思。

  7. 块表达式和语句终结符(;)

    在Scala语言当中,它是不需要语句终结符的,默认一行就是一条语句(Java中需要用;终结当前语句)

    块表达式:指的是{}中的值,只要被当前这个{}包含的叫块表达式。

  8. 输入和输出

    输出:print和println直接输出

    printf 初始化输出 (了解)

  9. 循环(while、for)

    如果跳出循环,有三种方式(变量、return、break)

    高级for循环: 在for循环中加if守卫的方式,限制循环条件,同时也可以将输出的数据,变成集合(构造集合yield)

  10. 函数和方法

    函数:定义函数 val f1 = (参数列表) =>{函数体} 函数分为匿名函数和非匿名函数

    方法: 方法的关键字,方法名,方法参数,方法返回值类型,方法体

    声明方法 def m1 (x:Int):Int = {x*x}

    在Scala编程中,声明方法后,我们可以将参数设置成函数,因为在Scala语言中,函数是可以通过参数传递到方法内部的,进行使用,如果说想将方法进行参数传递,那么你可以将需要传递的方法,转换成函数,在进行传递到方法内部,而在Java中 方法不能当参数传递

    案例:斐波那契数列(递归) def fab(n:Int):Int={if(n<=1) 1 else fab(n-1)+fab(n-2)}

  11. lazy关键字

    在Scala中,提供了lazy值的特性,也就是说,如果将一个变量声明为lazy(只有VAL变量可以声明lazy),则只有在第一次使用该变量时候,变量对应的表达式才会发生计算。这种特性针对于特别耗时的计算操作比较有效,比如打开文件进行IO,进行网络IO等。

  12. 数组(定长和变长)

    在Scala中,Array代表的含义和Java类似,也是长度不可变的数组,此外,由于Scala与java都是运行在JVM之上,双方可以互相调用。

    在Scala中,如果需要类似于Java中的ArrayList这种长度可变的集合类,则可以使用ArrayBuffer

    数据基本操作,添加 += 、++=、append,删除 remove ,转换 toArray、toBuffer

    数据输出:for方式,foreach,反转输出(reverse)

    定长数组:import scala.collection.immutable._(默认导入) 一般在创建数据或者初始化的时候,会使用的数组

    变长数组:import scala.collection.mutable._(手动导入) 一般在进行数据累加的时候,会使用,或者进行数据暂时存储的时候会使用

  13. 数组操作

    算法案例:移除第一个负数之后的所有负数

    val a = ArrayBufferInt

 while(index < arrayLength){
 if(a(index) > 0){
 index +=1 }
 else {
 if(!flag){flag = true;index +=1}
 else{a.remove(index);arrayLength -=1}
 }
 }
  1. Map与Tuple

    Map也分为可变与不可变之分,默认还是不可变的Map

    通过map里面的get方式获取值的值的时候返回的是Some,为什么?

    通过map里面的get方式获取值的值的时候如果key不存在会返回none,不报错,但是如果在.get就会报错,为什么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值