1 类的定义

package com

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

2构造器

package com

/**
* Created by Administrator on 2019/6/4.
*/
//跟类名交织在一起的叫主构造器
class Student(val name: String, var age: Int, faceValue: Double = 99.99, private var height: Int = 18) { private[this] var gender: String = null def show(): Unit = {
//faceValue = 1000
println(faceValue)
} //辅助构造器 def this (参数)
def this(name: String, age: Int, gender: String) {
//辅助构造器第一行一定要先调用主构造器
this(name, age)
this.gender = gender
} } object Student { def main(args: Array[String]) {
val p = new Student("zx", 30, 100, 180)
println(p.age)
println(p.name)
p.age = 18 p.height = 199 println(p.age) println(p.height) //val per = new Person
//println(per)
}
} object Main {
def main(args: Array[String]) {
val s = new Student("zx", 30, 100)
//s.height
}
}

3 单例对象

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

1.存放工具方法和常量

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

3.单例模式

package com

import scala.collection.mutable.ArrayBuffer

/**
* Created by Administrator on 2019/6/4.
*/
object SingletonDemo {
def main(args: Array[String]) {
//单例对象不需要new,用 类名.方法 调用对象中的方法
val session = SessionFactory.getSession()
println(session)
} } object SessionFactory { //该部分相当于java的静态块
var counts = 5
val sessions = new ArrayBuffer[Session]()
while (counts > 0) {
sessions += new Session
} //在object中的方法相当于java的静态方法
def getSession(): Session = {
sessions.remove(0)
}
} class Session { }

4 伴生对象

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

package com

/**
* Created by Administrator on 2019/6/4.
*/
class Dog {
val id = 1
private var name = "itcast" def printName(): Unit = {
//在Dog类中可以访问伴生对象Dog的私有属性
println(Dog.CONSTANT)
}
} //伴生对象
object Dog {
//伴生对象中的私有属性
private val CONSTANT = "汪汪汪汪汪汪:" def main(args: Array[String]) {
val p = new Dog
//访问私有的字段name
p.name = "123"
println(p.name)
p.printName()
}
}

5 apply方法

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

package com

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

6 应用程序对象

package com

/**
* Created by Administrator on 2019/6/4.
*/
object AppObjectDemo extends App {
//不用写main方法
println("i love you scala")
}

7 继承

扩展类

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

重写方法

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

类型检查和转换

Scala

Java

obj.isInstanceOf[C]

obj instanceof C

obj.asInstanceOf[C]

(C)obj

classOf[C]

C.class

超类的构造

package com

/**
* Created by Administrator on 2019/6/4.
*/
object ClazzDemo {
def main(args: Array[String]) { }
} trait Flyable {
def fly(): Unit = {
println(" I Can Fly")
} def fight(): String
} abstract class Animal { def run(): Int val name: String
} class Human extends Animal with Flyable {
val name = "abc"
val t1, t2, (a, b, c) = {
println("ABC")
(1, 2, 3)
}
println(a)
println(t1._1) //在Scala中重写一个非抽象方法必须用override修饰
override def fight(): String = {
"fight with 棒子"
} //在子类中重写超类的抽象方法时,不需要使用override关键字,写了也可以
def run(): Int = {
1
}
}

8 模式匹配和样例类

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

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

匹配字符串

package com

import scala.util.Random

/**
* Created by Administrator on 2019/6/4.
*/
object CaseDemo01 extends App { val arr = Array("zhangsan", "lisi", "wangwu", "zhaoliu") val name = arr(Random.nextInt(arr.length))
println(name) name match { case "zhangsan" => println("张三")
case "lisi" => println("李四")
case _ => println("王五")
}
}

匹配类型

object CaseDemo02 extends App {

  val arr2 = Array("zhangsan", 1, 2.0, CaseDemo01)

  val v = arr2(Random.nextInt(arr2.length))
println(v) v match { case x: Int => println("Int" + x)
case y: Double if (y > 0) => println("Double" + y)
case z: String => println("String" + z)
case _ => throw new Exception("not match exception")
}
}

匹配数组,元组

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

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

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

object CaseDemo03 extends App {
val arr = Array(1, 3, 5)
arr match {
case Array(1, x, y) => println(x + " " + y)
case Array(0) => println("only 0")
case Array(0, _*) => println("0 ...")
case _ => println("something else") } val lst = List(3, -1)
lst match {
case 0 :: Nil => println("only 0")
case x :: y :: Nil => println(s"x: $x y: $y")
case 0 :: tail => println("0 ...")
case _ => println("something else") }
val tup = (2, 3, 7)
tup match {
case (1, x, y) => println(s"1, $x , $y")
case (_, z, 5) => println(z)
case _ => println("else")
} }

样例类

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

package com

import scala.util.Random

/**
* Created by Administrator on 2019/6/4.
*/
case class SubmitTask(id: String, name: String) case class HeartBeat(time: Long) case object CheckTimeOutTask object CaseDemo04 extends App {
val arr = Array(CheckTimeOutTask, HeartBeat(12333), SubmitTask("0001", "task-0001")) arr(Random.nextInt(arr.length)) match {
case SubmitTask(id, name) => {
println(s"$id, $name")
}
case HeartBeat(time) => {
println(time)
}
case CheckTimeOutTask => {
println("check")
}
} }

option类型

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

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

偏函数

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

object PartialFuncDemo  {

  def func1: PartialFunction[String, Int] = {
case "one" => 1
case "two" => 2
case _ => -1
} def func2(num: String) : Int = num match {
case "one" => 1
case "two" => 2
case _ => -1
} def main(args: Array[String]) {
println(func1("one"))
println(func2("one"))
}
}

大数据学习——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. 关于ev||event事件对象的兼容写法

    因为FireFox Chrome默认都是有一个值传进来的,所以这里是对IE和FireFox Chrome做了兼容. 例如:页面点击事件事件要使用document,获取鼠标位置 document.onc ...

  2. ae(ArcEngine) java swing开发入门系列(1):开发环境和代码部署

    前言:做ae开发大部分人都是用C#版,很少用到java版,本系列文章主要介绍java版ae开发的入门,对于ae接口的高级应用,可以看C#版相关文章 开发环境软件: Intellij IDEA 2018 ...

  3. 通过CMD命令行创建和使用Android 模拟器 AVD

    进行Android APP测试时,若手持android手机设备稀少的情况下,我们可以通过创建Android模拟器AVD来代替模拟android手机设备,本文就具体介绍如何创建和使用AVD. 1.创建A ...

  4. AutoHotKey设置ide的光标功能键

    CapsLock:: SetCapsLockState,off ;锁定为小写 CapsLock & d:: flag_C=1 ;小写d代替control键,实现跨词移动CapsLock &am ...

  5. java面试题(杨晓峰)---以面试题为切入点,有效提升你的java内功

    java是一门历史悠久的编程语言,可以毫无争议的说,java是最主流的编程语言之一.全球有1200万以上的java程序猿以及海量的设备,还有无所不能的java生态圈. 我所知道的诸如阿里,京东,百度, ...

  6. 为了少点击几次,自己写了一个Chrome插件

    缘由 chrome应用商店有三款二维码插件,自己一直使用的第一款.这三款插件有且只有一个功能就是生成当前页面的URL的二维码. 其实这个功能基本上满足了需要移动端开发在微信里打开页面进行调试的情况. ...

  7. 如何真正解决“ UWP DEP0700: 应用程序注册失败。[0x80073CF9] 另一个用户已安装此应用的未打包版本。当前用户无法将该...”的问题

    http://www.cnblogs.com/hupo376787/p/8267796.html 谈到了解决该问题的临时方案,那如何真正的解决该问题 目测可以开启设备门户来删除包

  8. [VC]char 和 wchar_t相互转化

    #include <windows.h> #include <stdio.h> //function: charTowchar //purpose:char to WCHAR ...

  9. 为Oracle Clusterware修改公用及私有网络接口

    出于种种原因我们可能需要为已安装的Oracle集群软件修改其使用的公用或私有网络所使用的网络接口(How to Change Interconnect/Public Interface IP or S ...

  10. 爬虫2_python2

    # -*- coding: UTF-8 -*- # 正则表达式模块 import re # 获取路径模块 import urllib #时间模块 import time def getHtml(url ...