scala

一、scala的介绍

1、什么是scala?

官网 :https://www.scala-lang.or
scala是面向对象和函数式编程结合在一起的高级编程语言。

2、scala的优点?

  • 1)基于编程语言自身 1、优雅:代码简洁 2、速度快:运行速度快 3、能融合到hadoop生态圈中
  • 2)基于活跃度 1、作为spark的编程语言 2、成为未来大数据处理的主流语言

二、scala基础语法

1、变量的定义?

  • 1)数据类型可以指定,也可以不指定,那么就会进行数类型的自动推断。
    scala
  • 2)如果指定数据类型,数据类型的执行方式是在变量名后面写一个冒号,然后写上数据类型。 scala
  • 3)scala的修饰符一共有两个,一个是val,一个数val var修饰的的变量,变量的值可以改变
    val修饰的变量,变量的值不可以改变
  • 4)懒加载
    延迟加载,延迟赋值:
    scala
    用的时候进行计算:
    scala

2、数据类型?

7种数值类型Byte、Char、Short、Int、Long、Float和Double和Boolean类型再加上常用的String。
scala
scala

package com.mazh.scala.core
/**
 * 作者:mr qian
 */
object TypeDemo {
 def main(args: Array[String]): Unit = {
 val var_int = 1
 val var_double = 3.33
 val var_float = 2.4F
 val var_char = 'A'
 val var_bool = true

 val var_16 = 0x29
 val var_string = "aa"
 val var_string1 = "\"huangbo\""
 val var_string2 = """hello\thello\na\t\\"""
 println(var_string2)
}
}

注意:
1、 Any 是所有类的父类,包括值类型 AnyVal,和引用类型 AnyRef
2、 AnyVal 是所有值类型的父类,包括 Int,Double,Boolean,Unit 等等
3、 AnyRef 是所有引用类型的父类,包括 Null
4、 Null 是所有引用类型的子类
5、 Nothing 是所有类的子类
6、 Unit 类型只有一个实例,是(),相当于 java 中的 void,没有任何的实质意义
7、 Null 也只有一个实例,是 null,相当于 java 中的 null,能赋值给任何引用类型变量,不能赋值给值类型变量

3、scala基本类型操作

算术运算符: + - * / %
关系运算:> >= < <= == !=
逻辑运算:&& || !
位运算: & | ^ >> << >>>
对象比较:11 11.0 “huangbo” == “huangbo”

4、编码规范

关键字:
scala

5、流程控制语句

1)if:
val y = if (x > 0) 1 else -1 ; //判断 x 的值,将结果赋给 y
val z = if (x > 1) 1 else “error” //支持混合类型表达式
val m = if (x > 2) 1 //如果缺失 else,相当于 if (x > 2) 1 else ()
val n = if (x > 2) 1 else () //在 scala 中每个表达式都有值,scala 中有个Unit 类,写做(),相当于 Java 中的 void

  • 1)if 条件表达式它是有返回值的
  • 2)返回值会根据条件表达式的情况会进行自动的数据类型的推断(返回的是多个分支的共同父类
    2)块表达式:
    在 scala 中{}中课包含一系列表达式,块中最后一个表达式的值就是块的值
    scala
    3)for:
for 循环语法结构:for (i <- 表达式/数组/集合)
for (i <- 1 to 10):
for(i <- 表达式),表达式 1 to 10 返回一个 Range(区间)
for (str <- arr.reverse)  // 倒序打印

4)while
1)while 使用跟 java 一模一样
2)注意点:在 scala 里面不支持 i++ i-- 等操作统一写成 i+=1 i-=1

6、方法和函数

1)方法:
scala
方法的返回值类型可以不写,编译器可以自动推断出来,但是对于递归函数,必须指定返回类型
注意:函数体应该改成叫方法体!!!如果不写等号,代表没有返回值
2)函数
scala
函数的意义:表示接受两个 Int 类型的变量,然后做累加。经过 scala 的自动类型推断得知,最后返回的结果数据的类型也是 Int。
Function2 中 2 表示这个函数接收的参数个数是 2 个

3)方法和函数的区别
1.函数可以作为参数传递给方法,也就是说函数可以作为方法的参数
scala
2.函数可以作为方法的参数,但是也可以作为函数的参数
scala
3.方法也可以作为方法的参数
会自动把方法装换为函数作为参数,也可以通过“_”把方法转换为函数
scala
(方法体里可以传函数和方法,定义的时候不能使用方法作为参数,函数里面也是如此)

方法转换成函数: scala> val sum22 = sum11 _
函数转换成方法: scala> def sum33 = sum22

7、高阶函数

总结:
reduce是函数:
val reduce = (x:Int, y:Int, f: (Int, Int) => Int) => f(x, 1) + y
reudce1是方法:
def reduce1(x:Int, y:Int, f: (Int, Int) => Int) = f(x, 1) + y
sum 是函数:
val sum = (x:Int, y:Int) => x + y
sum1 是方法:
def sum1(x:Int, y:Int) = x + y
1.函数sum当做函数reduce的参数
scala> reduce(3, 4, sum)
res13: Int = 8
2. 方法sum1当做函数reudce的参数
scala> reduce(3, 4, sum1)
res14: Int = 8
3.把方法sum1转换成函数 当做 函数reduce的参数
scala> reduce(3, 4, sum1 _ )
res15: Int = 8
4.函数 sum当做方法 reduce1 的参数
scala> reduce1(3, 4, sum)
res16: Int = 8
5. 方法sum1当做方法reudce1的参数
scala> reduce1(3, 4, sum1)
res17: Int = 8

8.数组

定长数组: Array
val array = Array(1,2,5,6,7,8,9)
val array1 = new ArrayString
变长数组:ArrayBuffer 可伸缩的动态数组
val ab = new ArrayBufferInt
定长数组和变长数组的互相转换:
scala> array.toBuffer
scala> ab.toArray
多维数组:
val array2 = Array(Array(1,2), Array(2,3), Array(3,4))
数组算法:
scala

总结:

三个非常通用的方法:
数组转换:
map 映射 把其中的每个元素变成另外一个元素
scala
reduce 把一堆元素聚合成一个元素
filter 过滤

三、scala版wordcount

package scala_day01

object scala01 {
  def main(args: Array[String]): Unit = {
    //    1.准备数据
    val array = Array("hello you","hello me","hello word","hello his","his word")
    //    2.将数据变成map((单词,1))的格式
        val result01: Array[(String, Int)] = array.flatMap(_.split(" ")).map((_,1))
    //    3.将reusult01先分组
        val result02: Map[String, Array[(String, Int)]] = result01.groupBy(_._1)
    //    4.将result02变成map((单词,长度))  长度也就是该单词出现的次数
        val result03 = result02.map(t=>(t._1,t._2.size))
    //    5.将结果进行倒序排序  输出
         val result04: List[(String, Int)] = result03.toList.reverse
         result04.foreach(println)
  }
}

结果:

(word,2)
(hello,4)
(me,1)
(you,1)
(his,2)