一、基础语法

  1.变量类型

  

  // 上表中列出的数据类型都是对象,也就是说scala没有java中的原生类型。在scala是可以对数字等基础类型调用方法的。

  2.变量声明——能用val的尽量使用val!!!

  1.   //使用val定义的变量值是不可变的,相当于java里用final修饰的变量
  2. val i = 3
  3. //使用var定义的变量是可变得,在Scala中鼓励使用val
  4. var j = "hello"
  5. //Scala编译器会自动推断变量的类型,必要的时候可以指定类型
  6. var k: String = "world"

  3.条件表达式

    常规判断

  1. val i = 10
  2. if (i < 100) {
  3. println("i<100")
  4. } 
  1. //支持混合类型表达式,将结果返回给变量
  2. val z = if (x > 1) 1 else "error"

  4.块表达式

  1. //在scala中{}中课包含一系列表达式,块中最后一个表达式的值就是块的值
  2. //下面就是一个块表达式
  3. val result = {
  4. if (x < 0){
  5. -1
  6. } else if(x >= 1) {
  7. 1
  8. } else {
  9. "error"
  10. }
  11. }

  5.循环

  

  to是闭区间;until是左闭右开

  1. //for(i <- 表达式),表达式1 to 10返回一个Range(区间)
  2. //每次循环将区间中的一个值赋给i
  3. for (i <- 1 to 3) {
  4. println(i)
  5. }
  6.  
  7. //for(i <- 数组)
  8. for (i <- Array(1,3,5)) {
  9. println(i)
  10. }
  11.  
  12. //高级for循环
  13. //每个生成器都可以带一个条件,注意:if前面没有分号
  14. for (i <- 1 to 3; if i > 2) {
  15. println(i)
  16. }
  17.  
  18. //for推导式:如果for循环的循环体以yield开始,则该循环会构建出一个集合
  19. //每次迭代生成集合中的一个值
  20. val j = for (i <- 1 to 3) yield i * 2
  21. println(j)

  6.方法/函数声明

    方法

  1. def functionName ([参数列表]) : [return type]
  1. def m1(x: Int, y: String): String = {
  2. // 可以省略return,编译器会自动推断
  3. x + y
  4. }

    函数(有点儿像拉姆达表达式)

  1. val f = (x:Int) => 2*x

  在函数式编程语言中,函数是“头等公民”,它可以像任何其他数据类型一样被传递和操作

   结合Java8中拉姆达表达式,还是阔以理解的

  1. def m1(f: (Int, Int) => Int): Int = {
  2. f(1,2)
  3. }
  4. val f = (x:Int, y:Int) => x +y
  5.  
  6. m1(f)

    方法与函数的转换:

  1. def m1(x:Int, y:Int): Int = {
  2. x + y
  3. }
  4. // 使用下划线进行方法与函数的转换
  5. val f = m1 _

    使用的话,例如Java8中的集合的使用,list.map(),里边可以传入一个拉姆达表达式

二、数组、映射、元组、集合

  1.数组  

  Scala 语言中提供的数组是用来存储固定大小的同类型元素,数组对于每一门编辑应语言来说都是重要的数据结构之一。

  声明数组变量并不是声明 number0、number1、...、number99 一个个单独的变量,而是声明一个就像 numbers 这样的变量,然后使用 numbers[0]、numbers[1]、...、numbers[99] 来表示一个个单独的变量。数组中某个指定的元素是通过索引来访问的。

  数组的第一个元素索引为0,最后一个元素的索引为元素总数减1。

  声明:

  1.   // 初始化一个长度为8的定长数组,其所有元素均为0
  2. // 注意:如果new,相当于调用了数组的apply方法,直接为数组赋值
  3. val arr = new Array[Int](3)
  4. arr(0) = 3
  5. // 调用toBuffer,可以看到数组的内容,才不会打印hashCode值,其他类型类似
  6. println(arr.toBuffer)
  7.  
  8. // 声明时直接赋值
  9. val arr2 = Array("i","love","china")
  10. println(arr2.toBuffer)

  遍历:

  1. // 遍历数组
  2. for (x <- arr2) {
  3. print(x)
  4. }
  5. var total = 0
  6. // 遍历并求和(类似于0 until arr.length),这里使用的是IDEA的提示
  7. for (i <- arr.indices) {
  8. total += arr(i)
  9. }
  10. println(total)
  11. // 求最大值
  12. var max = arr(0)
  13. for (i <- 1 until arr.length) {
  14. if (arr(i) > max) max = arr(i)
  15. }

  转换:

  

  常用操作:

  1. //sum求和(数组与阿奴必须是数值型数据)
  2. println(change.sum)
  3.  
  4. //min max 输出数组中最小和最大元素
  5. println(change.min)
  6. println(change.max)
  7.  
  8. //使用sorted方法对数组或数组缓冲进行升序排序,这个过程不会修改原始数组
  9. val sortArr = ab.sorted
  10. for(elem <- sortArr)
  11. print(elem + ", ")
  12.  
  13. //使用比较函数sortWith进行排序
  14. val sortArr = ab.sortWith(_>_)
  15.  
  16. //数组显示
  17. println(sortArr.mkString("|"))
  18. println(sortArr.mkString("startFlag","|","endFlag"))

  可变数组ArrayBuffer,参考:https://blog.csdn.net/wild46cat/article/details/53820349

  2.映射

    Map在scala中就叫映射

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

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

  在 Scala 中 你可以同时使用可变与不可变 Map,不可变的直接使用 Map,可变的使用 mutable.Map。

  赋值取值也是很直观方便的:

  1. package com.jiangbei
  2.  
  3. import scala.collection.mutable
  4.  
  5. object ScalaDemo {
  6. def main(args: Array[String]): Unit = {
  7. // 定义Map
  8. val score = mutable.Map("小明" -> 100, "小红" -> 99, "小强" -> 65)
  9. // 追加内容
  10. score += ("小方" -> 61)
  11. // 取值
  12. println(score("小明"))
  1.    println(score.get("小明"))
  1. val high = mutable.Map("a" -> 1)
  2.  
  3. // 赋值 high("a") = 2 println(high) } }

  常用基本操作:

  

  1. // 定义Map
  2. val score = mutable.Map("小明" -> 100, "小红" -> 99, "小强" -> 65)
  3. // 追加内容
  4. score += ("小方" -> 61)
  5. // 遍历key
  6. score.keys.foreach(println)
  7. // 遍历value
  8. score.values.foreach(println)
  9. score.keys.foreach { k =>
  10. print(k)
  11. println(score(k))
  12. }

  Map合并:

  1. // 合并
  2. val score3 = score ++ score2

  更多映射操作,参考博文或查看API

  3.元组

  映射是K/V对偶的集合,对偶是元组的最简单形式,元组可以装着多个不同类型的值。

  定义:

  1. // 定义元组
  2. val t = (1, "love", 3.14)
  3. // 也可以通过如下方式定义元组
  4. /*元组的实际类型取决于它的元素的类型,比如 (99, "runoob") 是 Tuple2[Int, String]。
  5. ('u', 'r', "the", 1, 4, "me") 为 Tuple6[Char, Char, String, Int, Int, String]。
  6. 目前 Scala 支持的元组最大长度为 22。对于更大长度你可以使用集合,或者扩展元组。*/
  7. val t3 = new Tuple3(3.15, 100, "love")
  8. // 访问元组,通过下标的形式,下标从1开始
  9. println(t._1)

  迭代:

  1. // 迭代元组
  2. t.productIterator.foreach{e => println(e)}

  拉链:

    可以通过arr.zip(arr2);完成两个数组的绑定,结合成一个映射

  4.集合

  Scala的集合有三大类:序列Seq集Set映射Map,所有的集合都扩展自Iterable特质

  在Scala中集合有可变(mutable)和不可变(immutable)两种类型,immutable类型的集合初始化后就不能改变了(注意与val修饰的变量进行区别)

  1.Seq,是一组有序的元素。 
  2.Set,是一组没有重复元素的集合。 
  3.Map,是一组k-v对。

  更多介绍,参考:https://blog.csdn.net/bitcarmanlee/article/details/72795013

    

  序列:

  在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表。

  1. // 定义List,ListBuffer为可变的,当然,List[String]这个类型是可以省略的,因为Scala会进行类型推导
  2. val names: List[String] = List("i", "love", "china")
  3. val score = 1 :: 2 :: 3
  4. val ages: ListBuffer[Int] = ListBuffer(1, 2, 3, 4)
  5. // ListBuffer可变
  6. ages(0) = 2
  7. // 追加元素
  8. ages.append(5)
  9. ages += 6

  Set:

  1. package cn.itcast.collect
  2. import scala.collection.immutable.HashSet
  3.  
  4. object ImmutSetDemo extends App{
  5. val set1 = new HashSet[Int]()
  6. //将元素和set1合并生成一个新的set,原有set不变
  7. val set2 = set1 + 4
  8. //set中元素不能重复
  9. val set3 = set1 ++ Set(5, 6, 7)
  10. val set0 = Set(1,3,4) ++ set1
  11. println(set0.getClass)
  12. }
  1. package cn.itcast.collect
  2. import scala.collection.mutable
  3.  
  4. object MutSetDemo extends App{
  5. //创建一个可变的HashSet
  6. val set1 = new mutable.HashSet[Int]()
  7. //向HashSet中添加元素
  8. set1 += 2
  9. //add等价于+=
  10. set1.add(4)
  11. set1 ++= Set(1,3,5)
  12. println(set1)
  13. //删除一个元素
  14. set1 -= 5
  15. set1.remove(2)
  16. println(set1)
  17. }
  1. 通过 +=新增元素(-=减去元素)
  2. 通过max min查找最大值 最小值
  3. 通过.& .intersect查找交集
  4. 更多参阅API

   Map:

  1. package cn.itcast.collect
  2. import scala.collection.mutable
  3.  
  4. object MutMapDemo extends App{
  5. val map1 = new mutable.HashMap[String, Int]()
  6. //向map中添加数据
  7. map1("spark") = 1
  8. map1 += (("hadoop", 2))
  9. map1.put("storm", 3)
  10. println(map1)
  11.  
  12. //从map中移除元素
  13. map1 -= "spark"
  14. map1.remove("hadoop")
  15. println(map1)
  16. }

  都是通过+=进行元素的新增

  更多集合相关操作,参考:http://www.runoob.com/scala/scala-collections.html

  5.WordCount示例练习

    使用上面的知识编写WC代码,先导复习知识:https://blog.csdn.net/springlustre/article/details/52882205

  1. def main(args: Array[String]): Unit = {
  2. // 定义单词列表
  3. val words = List("i love china", "i am alone")
  4. // map方法中_有神奇的效果,其中的flatten压平方法,将map中切割产生的2个数组进行压平
  5. // words.map(_.split(" ")).flatten
  6. // 使用IDEA的建议,通过flatMap一步到位
  7. val allWords = words.flatMap(_.split(" "))
  8. println(allWords)
  9. // 将元素和1进行绑定成为map
  10. val wordsAndOne = allWords.map((_, 1))
  11. println(wordsAndOne)
  12. // 进行分组操作(返回一个映射),注意上一步得到是一个元组的集合,对元组访问采用_的形式
  13. val groupWords = wordsAndOne.groupBy(_._1)
  14. println(groupWords)
  15. // 进行最后的统计操作,注意对元素进行map操作时拿到的每个元素是元组,对于上一步的映射结果,每一个元组含2个元素
  16. // 使用匿名函数,返回新元组,这里不能使用_._1,_._2了,多个参数不能同时用_
  17. val res = groupWords.map(x => (x._1, x._2.size))
  18. println(res)
  19. // 排序,只有List有,所以必须先转换
  20. val res_sort = res.toList.sortBy(_._2).reverse
  21. println(res_sort)
  22. }

大数据入门第二十天——scala入门(二)scala基础01的更多相关文章

  1. 大数据入门第二十天——scala入门(一)入门与配置

    一.概述 1.什么是scala  Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性.Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序. ...

  2. 大数据入门第二十天——scala入门(二)scala基础02

    一. 类.对象.继承.特质 1.类 Scala的类与Java.C++的类比起来更简洁 定义: package com.jiangbei //在Scala中,类并不用声明为public. //Scala ...

  3. 大数据入门第十二天——sqoop入门

    一.概述 1.sqoop是什么 从其官网:http://sqoop.apache.org/ Apache Sqoop(TM) is a tool designed for efficiently tr ...

  4. 大数据入门第十二天——azkaban入门

    一.概述 1.azkaban是什么 通过官方文档:https://azkaban.github.io/ Azkaban is a batch workflow job scheduler create ...

  5. 大数据入门第十二天——flume入门

    一.概述 1.什么是flume 官网的介绍:http://flume.apache.org/ Flume is a distributed, reliable, and available servi ...

  6. 大数据入门第二十一天——scala入门(一)并发编程Actor

    注:我们现在学的Scala Actor是scala 2.10.x版本及以前版本的Actor. Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,老版本的Actor已经废弃 一. ...

  7. 大数据入门第十九天——推荐系统与mahout(一)入门与概述

    一.推荐系统概述 为了解决信息过载和用户无明确需求的问题,找到用户感兴趣的物品,才有了个性化推荐系统.其实,解决信息过载的问题,代表性的解决方案是分类目录和搜索引擎,如hao123,电商首页的分类目录 ...

  8. 大数据入门第十七天——storm上游数据源 之kafka详解(一)入门与集群安装

    一.概述 1.kafka是什么 根据标题可以有个概念:kafka是storm的上游数据源之一,也是一对经典的组合,就像郭德纲和于谦 根据官网:http://kafka.apache.org/intro ...

  9. 大数据入门第十一天——hive详解(一)入门与安装

    一.基本概念 1.什么是hive The Apache Hive ™ data warehouse software facilitates reading, writing, and managin ...

随机推荐

  1. jsp登录显示

    1.登录成功设置session request.getSession().setAttribute("user", user); 2.前台test <div class=&q ...

  2. Just write about

    创建一个学生对象,存储学生对象,学生对象的数据来源于键盘录入,最后遍历集合. 学生类,集合对象,键盘录入数据并将数据赋值给学生类的成员(可以写成一个方法),调用方法,遍历集合.

  3. go语言练习:go实现md5

    package main import ( "crypto/md5" "fmt" ) func main() { md5_ob := md5.New() md5 ...

  4. [钉钉通知系列]SVN提交后自动推送消息到钉钉群

    钉钉设置机器人配置 1.进入配置机器人入口 2.添加机器人 3.测试WebHook请求 本人使用Postman进行测试 4.配置SVN 4.1 配置 Pre-commit hook 设置提交内容必须包 ...

  5. JMeter安装+配置+运行

    环境配置: 操作系统:Win7系统 jdk版本:1.8 JMeter版本:3.0 一  JMeter的安装配置过程 JMeter是100%纯java应用程序,它在任何支持完整java实现的系统上都能正 ...

  6. Docker容器学习与分享08

    Docker容器网络 Docker除了默认创建的三种网络外,还可以自定义网络. 首先创建一个bridge类型的网络,使用docker network create命令. [root@promote ~ ...

  7. 'javac' 不是内部或外部命令,也不是可运行的程序

    今天在命令行中运行javac命令时发现 但是运行java命令却可以 查找jdk的安装路径发现,安装目录里面同时有jdk的文件夹和jre的文件夹 查看了jdk的目录发现jdk目录中也有一个jre文件夹 ...

  8. 028、HTML 标签1列表、图片、表格

    内容简单看一下理解就行了. HTML 是用来描述网页的一种语言.就是用来编写网页的语言 内容:换行.分割,标签属性,编码方式设置,字体标签,特殊符号,列表.图片.表格标签############### ...

  9. js字符串String常用方法

    1.   charAt()         返回指定位置的字符. str.charAt(index) index 为必须参数,类型为number(0到str.length-1之间,否则该方法返回 空串 ...

  10. java多重转型问题

    我们来看一个简单的问题,下面的代码会打印出什么? public class hello { public static void main(String[] args){ System.out.pri ...