1 类的定义

  1. package com
  2.  
  3. /**
  4. * Created by Administrator on 2019/6/3.
  5. */
  6. //类并不用声明为public。
  7. class Person {
  8. //用val修饰的变量是只读属性,有getter但没有setter
  9. //(相当与Java中用final修饰的变量)
  10. val id = "9527"
  11. //用var修饰的变量既有getter又有setter
  12. var age = 18
  13. //类私有字段,只能在类的内部使用
  14. private var name = "唐伯虎"
  15. //对象私有字段,访问权限更加严格的,Person类的方法只能访问到当前对象的字段
  16.  
  17. private[this] val pet = "小强"
  18.  
  19. }

2构造器

  1. package com
  2.  
  3. /**
  4. * Created by Administrator on 2019/6/4.
  5. */
  6. //跟类名交织在一起的叫主构造器
  7. class Student(val name: String, var age: Int, faceValue: Double = 99.99, private var height: Int = 18) {
  8.  
  9. private[this] var gender: String = null
  10.  
  11. def show(): Unit = {
  12. //faceValue = 1000
  13. println(faceValue)
  14. }
  15.  
  16. //辅助构造器 def this (参数)
  17. def this(name: String, age: Int, gender: String) {
  18. //辅助构造器第一行一定要先调用主构造器
  19. this(name, age)
  20. this.gender = gender
  21. }
  22.  
  23. }
  24.  
  25. object Student {
  26.  
  27. def main(args: Array[String]) {
  28. val p = new Student("zx", 30, 100, 180)
  29. println(p.age)
  30. println(p.name)
  31. p.age = 18
  32.  
  33. p.height = 199
  34.  
  35. println(p.age)
  36.  
  37. println(p.height)
  38.  
  39. //val per = new Person
  40. //println(per)
  41. }
  42. }
  43.  
  44. object Main {
  45. def main(args: Array[String]) {
  46. val s = new Student("zx", 30, 100)
  47. //s.height
  48. }
  49. }

3 单例对象

在Scala中没有静态方法和静态字段,但是可以使用object这个语法结构来达到同样的目的

1.存放工具方法和常量

2.高效共享单个不可变的实例

3.单例模式

  1. package com
  2.  
  3. import scala.collection.mutable.ArrayBuffer
  4.  
  5. /**
  6. * Created by Administrator on 2019/6/4.
  7. */
  8. object SingletonDemo {
  9. def main(args: Array[String]) {
  10. //单例对象不需要new,用 类名.方法 调用对象中的方法
  11. val session = SessionFactory.getSession()
  12. println(session)
  13. }
  14.  
  15. }
  16.  
  17. object SessionFactory {
  18.  
  19. //该部分相当于java的静态块
  20. var counts = 5
  21. val sessions = new ArrayBuffer[Session]()
  22. while (counts > 0) {
  23. sessions += new Session
  24. }
  25.  
  26. //在object中的方法相当于java的静态方法
  27. def getSession(): Session = {
  28. sessions.remove(0)
  29. }
  30. }
  31.  
  32. class Session {
  33.  
  34. }

4 伴生对象

在Scala的类中,与类名相同的对象叫做伴生对象,类和伴生对象之间可以相互访问私有的方法和属性

  1. package com
  2.  
  3. /**
  4. * Created by Administrator on 2019/6/4.
  5. */
  6. class Dog {
  7. val id = 1
  8. private var name = "itcast"
  9.  
  10. def printName(): Unit = {
  11. //在Dog类中可以访问伴生对象Dog的私有属性
  12. println(Dog.CONSTANT)
  13. }
  14. }
  15.  
  16. //伴生对象
  17. object Dog {
  18. //伴生对象中的私有属性
  19. private val CONSTANT = "汪汪汪汪汪汪:"
  20.  
  21. def main(args: Array[String]) {
  22. val p = new Dog
  23. //访问私有的字段name
  24. p.name = "123"
  25. println(p.name)
  26. p.printName()
  27. }
  28. }

5 apply方法

通常我们会在类的伴生对象中定义apply方法,当遇到类名(参数1,...参数n)时apply方法会被调用

  1. package com
  2.  
  3. /**
  4. * Created by Administrator on 2019/6/4.
  5. */
  6. object ApplyDemo {
  7. def main(args: Array[String]) {
  8. //调用了Array伴生对象的apply方法
  9. //def apply(x: Int, xs: Int*): Array[Int]
  10. //arr1中只有一个元素5
  11.  
  12. val arr1 = Array(5)
  13. println(arr1.toBuffer)
  14. //new了一个长度为5的array,数组里面包含5个null
  15. var arr2 = new Array(5)
  16. }
  17. }

6 应用程序对象

  1. package com
  2.  
  3. /**
  4. * Created by Administrator on 2019/6/4.
  5. */
  6. object AppObjectDemo extends App {
  7. //不用写main方法
  8. println("i love you scala")
  9. }

7 继承

扩展类

在Scala中扩展类的方式和Java一样都是使用extends关键字

重写方法

在Scala中重写一个非抽象的方法必须使用override修饰符

类型检查和转换

Scala

Java

obj.isInstanceOf[C]

obj instanceof C

obj.asInstanceOf[C]

(C)obj

classOf[C]

C.class

超类的构造

  1. package com
  2.  
  3. /**
  4. * Created by Administrator on 2019/6/4.
  5. */
  6. object ClazzDemo {
  7. def main(args: Array[String]) {
  8.  
  9. }
  10. }
  11.  
  12. trait Flyable {
  13. def fly(): Unit = {
  14. println(" I Can Fly")
  15. }
  16.  
  17. def fight(): String
  18. }
  19.  
  20. abstract class Animal {
  21.  
  22. def run(): Int
  23.  
  24. val name: String
  25. }
  26.  
  27. class Human extends Animal with Flyable {
  28. val name = "abc"
  29. val t1, t2, (a, b, c) = {
  30. println("ABC")
  31. (1, 2, 3)
  32. }
  33. println(a)
  34. println(t1._1)
  35.  
  36. //在Scala中重写一个非抽象方法必须用override修饰
  37. override def fight(): String = {
  38. "fight with 棒子"
  39. }
  40.  
  41. //在子类中重写超类的抽象方法时,不需要使用override关键字,写了也可以
  42. def run(): Int = {
  43. 1
  44. }
  45. }

8 模式匹配和样例类

Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句、类型检查等。

并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配

匹配字符串

  1. package com
  2.  
  3. import scala.util.Random
  4.  
  5. /**
  6. * Created by Administrator on 2019/6/4.
  7. */
  8. object CaseDemo01 extends App {
  9.  
  10. val arr = Array("zhangsan", "lisi", "wangwu", "zhaoliu")
  11.  
  12. val name = arr(Random.nextInt(arr.length))
  13. println(name)
  14.  
  15. name match {
  16.  
  17. case "zhangsan" => println("张三")
  18. case "lisi" => println("李四")
  19. case _ => println("王五")
  20. }
  21. }

匹配类型

  1. object CaseDemo02 extends App {
  2.  
  3. val arr2 = Array("zhangsan", 1, 2.0, CaseDemo01)
  4.  
  5. val v = arr2(Random.nextInt(arr2.length))
  6. println(v)
  7.  
  8. v match {
  9.  
  10. case x: Int => println("Int" + x)
  11. case y: Double if (y > 0) => println("Double" + y)
  12. case z: String => println("String" + z)
  13. case _ => throw new Exception("not match exception")
  14. }
  15. }

匹配数组,元组

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

9 :: List(5, 2)  :: 操作符是将给定的头和尾创建一个新的列表

注意::: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))

  1. object CaseDemo03 extends App {
  2. val arr = Array(1, 3, 5)
  3. arr match {
  4. case Array(1, x, y) => println(x + " " + y)
  5. case Array(0) => println("only 0")
  6. case Array(0, _*) => println("0 ...")
  7. case _ => println("something else")
  8.  
  9. }
  10.  
  11. val lst = List(3, -1)
  12. lst match {
  13. case 0 :: Nil => println("only 0")
  14. case x :: y :: Nil => println(s"x: $x y: $y")
  15. case 0 :: tail => println("0 ...")
  16. case _ => println("something else")
  17.  
  18. }
  19. val tup = (2, 3, 7)
  20. tup match {
  21. case (1, x, y) => println(s"1, $x , $y")
  22. case (_, z, 5) => println(z)
  23. case _ => println("else")
  24. }
  25.  
  26. }

样例类

在Scala中样例类是一中特殊的类,可用于模式匹配。case class是多例的,后面要跟构造参数,case object是单例的

  1. package com
  2.  
  3. import scala.util.Random
  4.  
  5. /**
  6. * Created by Administrator on 2019/6/4.
  7. */
  8. case class SubmitTask(id: String, name: String)
  9.  
  10. case class HeartBeat(time: Long)
  11.  
  12. case object CheckTimeOutTask
  13.  
  14. object CaseDemo04 extends App {
  15. val arr = Array(CheckTimeOutTask, HeartBeat(12333), SubmitTask("0001", "task-0001"))
  16.  
  17. arr(Random.nextInt(arr.length)) match {
  18. case SubmitTask(id, name) => {
  19. println(s"$id, $name")
  20. }
  21. case HeartBeat(time) => {
  22. println(time)
  23. }
  24. case CheckTimeOutTask => {
  25. println("check")
  26. }
  27. }
  28.  
  29. }

option类型

在Scala中Option类型样例类用来表示可能存在或也可能不存在的值(Option的子类有Some和None)。Some包装了某个值,None表示没有值

  1. object OptionDemo {
  2. def main(args: Array[String]) {
  3. val map = Map("a" -> 1, "b" -> 2)
  4. val v = map.get("b") match {
  5. case Some(i) => i
  6. case None => 0
  7. }
  8. println(v)
  9. //更好的方式
  10. val v1 = map.getOrElse("c", 0)
  11. println(v1)
  12. }
  13. }

偏函数

被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A, B]的一个实例,A代表参数类型,B代表返回类型,常用作输入模式匹配

  1. object PartialFuncDemo {
  2.  
  3. def func1: PartialFunction[String, Int] = {
  4. case "one" => 1
  5. case "two" => 2
  6. case _ => -1
  7. }
  8.  
  9. def func2(num: String) : Int = num match {
  10. case "one" => 1
  11. case "two" => 2
  12. case _ => -1
  13. }
  14.  
  15. def main(args: Array[String]) {
  16. println(func1("one"))
  17. println(func2("one"))
  18. }
  19. }

大数据学习——scala类相关操作的更多相关文章

  1. 大数据学习——scala集合练习

    package com /** * Created by ZX on 2016/4/5. */ object ListTest { def main(args: Array[String]) { // ...

  2. 大数据学习——scala数组

    package com import scala.collection.mutable.ArrayBuffer /** * Created by Administrator on 2019/4/8. ...

  3. 大数据学习——scala入门练习

    package com /** * Created by ZX on 2015/11/6. */ object VariableDemo { def main(args: Array[String]) ...

  4. 大数据学习——scala入门程序

    安装scala.msi https://blog.csdn.net/sinat_32867867/article/details/80305302 notepad++ object HelloScal ...

  5. 大数据学习之HDFS基本命令操作05

    1)hdfs的客户端 1.网页形式->测试用 http://192.168.40.11:50070/dfshealth.html#tab-overview 2.命令行形式->测试用 3.企 ...

  6. 大数据学习——scala的wordCount小例子

    val lines=List("hello tom hello jerry","hello tom hello kitty hello china") //方法 ...

  7. 大数据学习——scala函数与方法

    package com /** * Created by Administrator on 2019/4/8. */ object TestMap { def ttt(f: Int => Int ...

  8. 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机)

    引言 在大数据学习系列之一 ----- Hadoop环境搭建(单机) 成功的搭建了Hadoop的环境,在大数据学习系列之二 ----- HBase环境搭建(单机)成功搭建了HBase的环境以及相关使用 ...

  9. 大数据学习系列之五 ----- Hive整合HBase图文详解

    引言 在上一篇 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机) 和之前的大数据学习系列之二 ----- HBase环境搭建(单机) 中成功搭建了Hive和HBase的环 ...

随机推荐

  1. Android Studio maven-metadata.xml 卡着不动原因和解决方法

    头一天好好的,第二天就卡着了. 一直在这个地方不动,如果停止就会报 Error:Could not run build action using Gradle distribution ‘https: ...

  2. xcode在代码中查找中文

    总是忘记xcode中查找中文,这次记下来,以后就不会忘记了,哈哈 请看下图: 切换到查找,点击find后面的text,选择Regular Expression,然后输入 1. 查找非ascii的字符 ...

  3. checkbox 全选 单选的使用

    绑定数据 if (!IsPostBack) { using (UsersDataContext con = new UsersDataContext()) { Repeater1.DataSource ...

  4. CSS中padding、margin两个重要属性的详细介绍及举例说明

    http://www.x6x8.com/IT/199.html 本文将讲述HTML和CSS的关键—盒子模型(Box model). 理解Box model的关键便是margin和padding属性, ...

  5. 【UWP】【新坑】Excel批量翻译工具(1)

    嗯……具体思路是这样的.使用的时候,你导入一个excel,直观地选择某些区域,选择语言点击翻译,就可以对多个单元格进行批量翻译,并且支持多种不同的导出格式(excel副本.txt文件……) 1,多种翻 ...

  6. 如果不需要,建议移除net standard类库中的Microsoft.NETCore.Portable.Compatibility

    使用Microsoft.NETCore.Portable.Compatibility会破坏该类库在Mono和Xamarin平台的兼容性 可能导致的问题 provides a compile-time ...

  7. CF Gym 100637F The Pool for Lucky Ones

    题意:给你一串非负整数,可以将一个非零数减1,加到相邻的数字上,要使其中所有最大数字的和最小. 题解:模拟可以过.也可以分析,可以要减少最大数字和,如果最大数字出现大于等于3次,可以把最大数字加一,或 ...

  8. 字符编码ANSI和ASCII区别、Unicode和UTF-8区别

    ANSI码ANSI编码是一种对ASCII码的拓展:ANSI编码用0x00~0x7f (即十进制下的0到127)范围的1 个字节来表示 1 个英文字符,超出一个字节的 0x80~0xFFFF 范围来表示 ...

  9. 2018.3.26 Linux下学习命令

    Linux下的终端文件颜色说明 ---color[=WHEN] 用色彩辨别文件类型 WHEN 可以是'never'.'always'或'auto'其中之一 白色:表示普通文件 蓝色:表示目录 绿色:表 ...

  10. ubuntu18.04 安装五笔拼音

    sudo apt install fcitx-table-wubi fcitx-table-wbpy 在输入法中加入五笔拼音就可以了,如果原来使用的是ibus, 改为fcitx后,重启机器.