Scala02

1.修饰变量用val、var

在Scala里面,定义一个名称的东西只需要这两个就够了,不像Java等语言有很多修饰符:val var
val修饰的是不可变的
var修饰的是可变的

val name:String = “zhangsan”
定义了一个变量name,它的类型为String,它的值是zhangsan,这个变量的值不可改变
如果用var修饰,就可以改变

scala> val name:String ="zhangsan"
name: String = zhangsan

scala> name ="lisi"
<console>:12: error: reassignment to val
       name ="lisi"
            ^
scala> var city:String ="shanghai"
city: String = shanghai

scala> city ="beijing"
city: String = beijing

2.Scala里的数据类型是可以自动推导的

val 名称 = 值 只要=号后面有值,就不用写类型了,Scala中,它会自动从后面往前推导

scala> val name = "wangwu"
name: String = wangwu

scala> val age = 10
age: Int = 10

scala> var money = 111111111111
<console>:1: error: integer number too large
       var money = 111111111111
                   ^
#后面需要加个L
scala> var money = 2222222222222L
money: Long = 2222222222222

scala> val a:Float = 1.2
<console>:11: error: type mismatch;
 found   : Double(1.2)
 required: Float
       val a:Float = 1.2
                     ^
#上面这种情况需要加个f/F
scala> val a:Float = 1.2f
a: Float = 1.2

3.Scala数据类型

Scala中有很多数据类型,比如
Byte Char
Short Int Long Float Double
Boolean

数据类型转换:
asInstanceOf 类型转换
isInstanceOf 判断类型

#将整型10 转换为Double型
scala> val aaa = 10.asInstanceOf[Double]
aaa: Double = 10.0
#判断aaa是否为Int类型
scala> aaa.isInstanceOf[Int]
res1: Boolean = false
#判断10.1是不是Int类型
scala> 10.1.isInstanceOf[Int]
res2: Boolean = false

4.函数(方法)

在这里插入图片描述

package com.ruoze.bigdata.scala.scala02

object FunctionApp {
  def main(args: Array[String]): Unit = {
    println(sum(12, 23))
    sayHello           //函数没有入参,括号可以省略    所以也可以这样写sayHello
    sayWorld("world")      //这个括号不能省略
  }

  def sum(x: Int, y: Int):Int = {
    x + y
  }
  def sayHello(): Unit ={
    println("welcome to China")
  }
  def sayWorld(name:String): Unit ={
    println("Hello " + name)
  }

}

当方法体只有一行时,可以直接这样写:

def sum(x: Int, y: Int)= x + y

注意函数上面有Unit这个时,是没有返回值的。

5.循环表达式

1到10
1 to 10 : [] 这个是左闭右闭 等价于 1.to(10) 产出Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Range(1,10) : [) 左闭右开
Range(1,10,2) 2是步长
1 until 10 等价于Range(1,10) 等价于 1.until(10)

看源代码,to until 底层调用的都是Range 只是Inclusive 或者否罢了

scala> 1 to 10
res2: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> Range(1,10)
res3: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)

scala> Range(1,10,2)
res4: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9)

scala> Range(10,1,-1)
res5: scala.collection.immutable.Range = Range(10, 9, 8, 7, 6, 5, 4, 3, 2)

scala> 1 until 10
res6: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)

使用:

#把1到10的数字 分别赋值给i   然后里面循环打印i
    for(i <- 1 to 10){
      println(i)
    }

打印1到10之间的偶数

    for(i <- 1 to 10    if i%2==0){
      println(i)
    }

6.面向对象

类 -----针对sparkconf解析

class 来定义类
类中包含了属性和方法。
class是要new出来才能进行属性方法的调用。

val 属性=_
这个下划线 表示占位符 先占个坑,先不管如何使用它,先占个坑再说
var name = _ 这样是错误的,因为先占个坑的话,需要指定一个数据类型
var name:String = _ 这样是对的

#有默认值
scala> var d:Double = _
d: Double = 0.0

scala> var d:String =_
d: String = null

举例:

object SparkConfApp {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf
    sparkConf.setAppName("SparkConfApp")
    sparkConf.setMaster("yarn")
    sparkConf.printInfo()
  }
}
class SparkConf{
  var master:String = _
  var appName:String = _

  def setMaster(master:String): Unit ={
    this.master = master
  }
  def setAppName(name:String): Unit ={
    this.appName = name
  }
  def printInfo(): Unit ={
    println(this.appName + ":" + this.master)
  }
}

由上面代码衍生出升级版:

package com.ruoze.bigdata.scala.scala02

import java.util.concurrent.ConcurrentHashMap

object SparkConfApp2 {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf
    sparkConf.setAppName("SparkConfApp").setMaster("yarn")   //链式编程

    sparkConf.printInfo()
  }
}

class SparkConf{
  var master:String = _
  var appName:String = _

  //在这里定义一个setting,里面可以放好多东西,先不用管它什么意思
  //可以先把两个值放里面,然后用的时候再取出来
  var setting = new ConcurrentHashMap[String,String]()

  //这个方法的数据结果是key,value结构,它的底层肯定是个Map
  //调用上面的setting,来设置key,value
  //后面调用一下set方法,就可以设置key,value了
  //放值是用setting.put(key,value),取值是setting.get(key),放进去什么就取什么
  //就是弄一个key放进去,把这个key的值设置为value值,当取的时候,直接用key去获取这个值就行了
  //private表示私有的,只能在自己的类里面使用
  private[this] def set(key:String,value:String):SparkConf = {
    setting.put(key,value)
    this
  }

  //调用set方法,设置master,master的key是spark.master,master的value是你传进来的值
  def setMaster(master:String): SparkConf ={   //返回值是SparkConf ,这样才能实现链式编程
    set("spark.master",master)
  }

  //调用set方法,设置name
  def setAppName(name:String): SparkConf ={
    set("spark.app.name",name)
  }

  def printInfo(): Unit ={
    //在这里就可以取值了,用"spark.app.name"这个key,可以取到对应的值了
    val appName = setting.get("spark.app.name")
    val master = setting.get("spark.master")
    println(appName + ":" + master)
  }
}


可以看一下orge.apache.spark.SparkConf里面的源码,和上面一样
需要在pom.xml文件里加入下面:

  <properties>
    <spark.version>2.4.0</spark.version>
  </properties>
  
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-core_2.11</artifactId>
      <version>${spark.version}</version>
    </dependency>

构造方法(主构造器和附属构造器)

创建对象的时候需要借助构造方法的。
其实上面的类就是一个构造方法。
如果你这样写

class Person(val name:String,val city:String){
}

底层会自动这样处理:

class Person1(){
  val name:String =_
  val city:String =_
}

现在写一个构造方法:

object ConstrutorDemo {
  def main(args: Array[String]): Unit = {
    val person = new Person("Jerry","shanghai")
    println(person.name + " : " + person.city)
  }
}
class Person(val name:String,val city:String){
  println("person enter....")

  println("person leave....")
}

运行结果:

person enter....
person leave....
Jerry : shanghai

Process finished with exit code 0

其实在new 一个Person的时候,类里面的代码已经先执行完了。

主构造器:class + 类名 就是主构造器
跟在class后面的就是主构造器(上一节的那些类都是主构造器)
这个Person就是主构造器

class Person(val name:String,val city:String){
  println("person enter....")
  println("person leave....")
}

主构造器,附属构造器,综合代码:

object ConstrutorDemo {
  def main(args: Array[String]): Unit = {
    val person = new Person("Jerry","shanghai")  //这里面不能把age加上
    println(person.name + " : " + person.city + " : " + person.age)

    val person2 = new Person("Jerry","beijing",20)   //这里面可以加上age
    println(person2.name + " : " + person2.city + " : " + person2.age)
  }
}

class Person(val name:String,val city:String){
  println("person enter....")

  var age:Int =_

  //附属构造器 第一行必须要调用主构造器或者其他附属构造器
  //固定写法
  def this(name:String,city:String,age:Int){
    this(name,city)    //第一行必须这样写
    this.age = age    //这里的this指的是主构造器
  }
  println("person leave....")
}

运行结果:

person enter....
person leave....
Jerry : shanghai : 0
person enter....
person leave....
Jerry : beijing : 20

Process finished with exit code 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值