写在前面

面向java开发者。实际上,具有java基础学习scala是很容易。java也可以开发spark,并不比scala开发的spark程序慢。但学习scala可有助于更快更好的理解spark。比如spark的很多算子group,filter之类的,全都是scala语言本身所具备的功能。再比如,想做一个更高级别的spark开发者,势必需要了解spark源码。哪怕不需要通读,但也需要了解scala语言。

快速入门的意思先具备一个宏观上的系统而整体的把控,然后再到这个框架上去把血肉丰满。从阅读源码的角度来说,作为一个java开发者,在数据类型和容器,控制语句等方面,哪怕不会写,至少能大致读懂。但涉及到更高层次的高阶函数,就很头痛了。

比如list。只会讲声明,增删查改以及循环。就能满足大多数情况下的开发。至于其它的功能,通过查看文档,或者源码,就可以搞懂。涉及到像增这一块,比如添加一个元素,list有【++: ++ +: :+ :: ::: :\】等很多功能。但本文只涉及最简单的东西。总之,这是一个简易版的入门。后续的学习不能停止

数据类型

scala数据类型与java基本类似。scala在面向对象方面,比java列我彻底。java有8种基本数据类型,在scala里面全是对象。

Byte 8位有符号补码整数。数值区间为 -128 到 127
Short  16位有符号补码整数。数值区间为 -32768 到 32767
Int 32位有符号补码整数。数值区间为 -2147483648 到 2147483647
Long  64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807
Float  32位IEEE754单精度浮点数
Double  64位IEEE754单精度浮点数
Char  16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF
Boolean  true或false

其它常见数据类型:

Unit  表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。
Null  null 或空引用
Nothing  Nothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。
Any  Any是所有其他类的超类
AnyRef  AnyRef类是Scala里所有引用类(reference class)的基类

变量

在 Scala 中,使用关键词 "var" 声明变量,使用关键词 "val" 声明常量。

声明变量实例如下:

var myVar : String = "Foo"
var myVar : String = "Too"

以上定义了变量 myVar,我们可以修改它。

声明常量实例如下:

val myVal : String = "Foo"

以上定义了常量 myVal,它是不能修改的。如果程序尝试修改常量 myVal 的值,程序将会在编译时报错。

变量声明不一定需要初始值,以下也是正确的:

var myVar :Int;
val myVal :String;

变量类型引用

在 Scala 中声明变量和常量不一定要指明数据类型,在没有指明数据类型的情况下,其数据类型是通过变量或常量的初始值推断出来的。

所以,如果在没有指明数据类型的情况下声明变量或常量必须要给出其初始值,否则将会报错。

var myVar = 10;
val myVal = "Hello, Scala!";

以上实例中,myVar 会被推断为 Int 类型,myVal 会被推断为 String 类型。


Scala 多个变量声明

Scala 支持多个变量的声明:

val xmax, ymax = 100  // xmax, ymax都声明为100

集合

list
//定义
var list = List("spark","hadoop","storm")
var nums = List("sdf","spark")
val empty : List[Nothing] = List() val list2 = list.+:("sdf")//在头部添加元素
println(list2)
val list3 = list.++(nums)//合并两个集合
println(list3)
val list4 = list.:+("sdf")//在尾部添加元素
println(list4) val item = list take 3 //取前几个元素
val head = list.head//取第一个元素
val last = list.last//取最后一个元素 list.updated(1, "mr")//更新 //循环
list.foreach(println)
list.map(println)

数组

大体与list相当

    //array
val array : Array[Any] = Array("spark","hadoop","storm")
println(array)
val array2 : Array[String] = Array("spark2","hadoop2")
array.foreach(println)
println(array(0))//取值
println(array.apply(0))//取值
val array3 = array.++:(array2)
println("================")
array3.foreach(println)//循环
val array4 = array.+:("spark").:+("hadoop")//加值
println("================")
array4.foreach(println) val array5 = array.++(array2) array5.foreach(print) //seq
val seq = Seq("hadoop","spark")
println(seq)

map

Map 有两种类型,可变与不可变,区别在于可变对象可以修改它,而不可变对象不可以。

默认情况下 Scala 使用不可变 Map。如果你需要使用可变集合,你需要显式的引入 import scala.collection.mutable.Map

    var map = Map("spark"->1,"hadoop"->"1")
val map2 = Map("spark2"->1,"hadoop2"->"1")
val map3 = map.+(("storm"->1))//添加一个元素
map += ("storm"->1)//添加一个元素
val map4 = map.++(map2)//合并两个集合
println(map4)
map.contains("spark")//判断一个元素是否存在
map.isEmpty//是否为空
//得到key集合
val keys2 : Iterable[String] = map.keys
val keys : Set[String] = map.keySet
val iter : Iterator[String] = map.keysIterator

set

Scala Set(集合)是没有重复的对象集合,所有的元素都是唯一的。

Scala 集合分为可变的和不可变的集合。

默认情况下,Scala 使用的是不可变集合,如果你想使用可变集合,需要引用 scala.collection.mutable.Set 包。

   val set = Set("spark","spark","hadoop")
set += "storm" //异常
val mutableSet : Set[String] = Set("spark","spark","hadoop")
mutableSet += "hive"
println(mutableSet)
mutableSet.add("scala")
println(mutableSet)
mutableSet.remove("scala")
println(mutableSet)
mutableSet -= "hive"
println(mutableSet)



spark快速开发之scala基础之1 数据类型与容器的更多相关文章

  1. spark快速开发之scala基础之5高阶函数,偏函数,闭包

    高阶函数 高阶函数就是将函数作为参数或者返回值的函数. object function { def main(args: Array[String]): Unit = { println(test(f ...

  2. spark快速开发之scala基础之3类,对象,特征

    类 scala的类定义非常灵活 class test4 class test2{} class test3(x:Int) 定义一个带构造函数的类 class Point (x : Int,y : In ...

  3. spark快速开发之scala基础之2控制流程

    判断结构 大体与java相当.scala没有三元表达式. val num = if(1>0) 1 else 0 //相当于匿名函数 println(num) var num2 = 0 if(1& ...

  4. Android Studio快速开发之道

    概述 现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的,今天就根据自己的经验来给大家介绍一下Android Studio快速开发之道. P ...

  5. iOS 开发之 GCD 基础

    header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em} .markdown-body{overflow:hidden} .markdo ...

  6. ios开发之OC基础-类和对象

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

  7. ios开发之OC基础-oc小程序

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

  8. ios开发之OC基础-ios开发学习路线图

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

  9. Hybrid App开发之JavaScript基础

    前言: 前面学习了html和css的基本使用,今天开始学习JavaScript的使用. 什么是JavaScript JavaScript是一种基于对象(Object)和事件驱动(Event Drive ...

随机推荐

  1. 代码: js: 数值操作

    数值转换: 将 32000 这样的数字,转换为“3.2万” //将32000 这样的数字,转换为 “3.2万” var price = parseInt('31999'); var price2 = ...

  2. 电子书 VS 纸质书

    电子书, 或者网络上的博客,技术文章(最好是 一系列的, 完整的). 比起纸质书来说, 优势在于: 1 根据左部的目录快速定位 到自己想看的章节.通过PgDn PgUp 等键盘功能快速翻页 2 方便的 ...

  3. linux系统安全更新

    um --security upgrade 一.参考文档:  https://blog.csdn.net/ubuntu64fan/article/details/80927212 二.Linux主机定 ...

  4. layui动态options

    layui 坑 layui 针对各种表单元素做了较为全面的UI支持,你无需去书写那些 UI 结构,你只需要写 HTML 原始的 input.select.textarea 这些基本的标签即可.我们在 ...

  5. 05.linux目录结构

      bin  存放二进制可执行文件(ls,cat,mkdir等)   boot  存放用于系统引导时使用的各种文件   dev 用于存放设备文件   etc  存放系统配置文件   home 存放所有 ...

  6. 03.设计模式_抽象工厂模式(Abstract Fcatory)

    抽象工厂模式:创建一些列相关或者互相依赖的对象的接口,而无需指定他们具体的类, 1.创建工厂Factory: package patterns.design.factory; import java. ...

  7. MVC基于角色权限控制--菜单展示

    在用户成功登陆后台页面后,我们需要将当前用户拥有的权限通过菜单的形式展现出来,将未具备的权限隐藏 新建一个HomeController,用于展示后台首页和获取用户权限数据 namespace CZBK ...

  8. jquery 属性-记住

    $("").attr(); $("").removeAttr(); $("").prop(); $("").remove ...

  9. elasticsearch-java异常

    1. Unsupported major.minor version 52.0 java的jdk版本过低导致,需要更换为jdk1.8+ 2. elasticsearch 的version在pom中提示 ...

  10. LeetCode 题解:Populating Next Right Pointers in Each Node I & II 二有难度。考虑不全面。

    每次应该把root同层的右侧节点传过来.如果没有,就传NULL. 同时,应该是先右后左. 感觉这次的代码还挺简洁的.. void construct(struct TreeLinkNode *root ...