Scala:基础知识02

Posted Xiao Miao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala:基础知识02相关的知识,希望对你有一定的参考价值。

Scala基础知识

一、函数式编程

集合、数组支持函数作为参数

1.map

功能:接收一个函数式参数f 作用于集合中每个元素,返回构成一个新的集合。

def map[B](f:(A)=>B):Array[B] 

在这里插入图片描述

2.filter

功能:接收函数式参数p 应用于集合的每个元素,结果为true的保留下来 就是过滤的功能

def filter(p: (T) ⇒ Boolean): Array[T]

在这里插入图片描述

3.排序

sorted:不需要传递参数,默认升序排序
sorteBy:接受一个函数式参数f根据f返回的值排序
sortwith:自定义排序规则 根据两个元素比较的结果排序 小于返回true,大于返回false

在这里插入图片描述在这里插入图片描述在这里插入图片描述

4.分组

grouped :把几个元素分为一组
groupBy :根据谁把数据分为一组

在这里插入图片描述

5.扁平化

flatten:将嵌套数据中里层的集合抹去 扁平化压平操作
flatMap:先进行map操作,操作的结果在进行flateen扁平化
在这里插入图片描述在这里插入图片描述

6.聚合操作

reduce
reduceLeft
reduceRight

在这里插入图片描述

fold
foldleft
foldRight
在这里插入图片描述

7.遍历foreach

在这里插入图片描述

二、面向对象编程

1.类的定义

  • 使用class定义类 普通的类 必须通过new才能创建实例 多例
  • 使用object定义类 特殊的类 不需要new 全局唯一的实例 单例 内部方法属性都是静态的
class Student {
//todo 在scala中不需要显示setter getter方法
//todo 对应val常量 只有getter 对于 var 既有setter 又有getter
//  定义属性和方法
  var id:Int=_  //可以使用_进行初始值
  var name:String=_
  val country:String="China"
  def sayHello=println("Hello")
}


object  Test01{
  def main(args: Array[String]): Unit = {
    val s:Student=new Student
        s.name="zhangsan"
        println(s"${s.country}-->${s.name}")
        s.sayHello
      }
}

2.Object静态特性

  • 在scala中,没有static关键字的,但是object定义的类中,方法和属性都相当于静态
  • 使用object定义一些通用的方法 作为工具类
  • main方法也必须定义在object中
class Session {

}

//todo 使用object定义个工具类
object SessionUtils{

  val session:Session = new Session

  def  getSession:Session = this.session
}

object Test01{
  def main(args: Array[String]): Unit = {

    val s1 = new Session //因为session类是class 必须new才可以创建实例 进而操作里面的方法和属性

    val s2: Session = SessionUtils.session  //对象.属性
    val s3: Session = SessionUtils.getSession  //对象.方法
  }
}

main方法

  • 功能和java的main方法一样 都是程序的入口方法

  • 因为scala没有static关键字 因此main方法只能定义在object中

  • 除了显示定义main方法之外,还可以通过继承APP Trait实现main方法。

object test01 extends App{
  println("Hello")
}

3.构造器

  • 构造器又叫做构造方法,其目的在创建对象的时候完成属性赋值。

java中构造器

  • 本质都是方法 和类名重名的方法
  • 分为有参构造和无参构造 默认拥有一个无参构造
  • 当显示定义有参构造的时候 会覆盖掉默认的无参构造 因此还需要在显示定义一下无参构造。
public class Teacher {
    private int ID;
    private String name;

    //java中 默认有一个无参构造器


    public Teacher() {
    }

    public Teacher(int ID, String name) {
        this.ID = ID;
        this.name = name;
    }

    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


public class Test01 {
    public static void main(String[] args) {
        Teacher t = new Teacher();  //通过无参构造创建实例
        t.setID(1);
        t.setName("miao");

        System.out.println(t.getName());

        Teacher t2 = new Teacher(2, "张三");
        System.out.println(t2.getName());
    }
}

scala中构造器

  • scala中构造器从功能上来讲和java一样,分为主构造器和辅助构造器

  • 主构造器和类的定义交织在一起

class 类名(var/val 参数名:类型 = 默认值, var/val 参数名:类型 = 默认值){
	// 构造代码块
}

辅助构造器是名字叫做this的方法。

def this(参数名:类型, 参数名:类型) {
// 第一行需要调用主构造器或者其他构造器
// 构造器代码
}
/**
 *   todo 1、scala中类的主构造器是和类的定义交织在一起的:
 *             类名的后面参数列表就是主构造器的列表
 *        2、主构造器的参数会自动成为类的成员属性 不需要在类中重复定义了
 *        3、类中除了方法和属性之外 其他都是主构造器的一部分
 */
class Teacher(var id:Int,var name:String) {
  
  println("主构造器执行01")
  val country:String ="China"

  def sayHello = println("hello!!")

  println("主构造器执行结束了01")
}


object Test01{
  def main(args: Array[String]): Unit = {
//    val t = new Teacher
//    t.id =1
//    t.name="miao"
//    println(t.name+"---"+t.id)

    val m = new Teacher1(1, "miao") //通过主构造器创建的对象实例 同时完成属性赋值
    m.sayHello
  }
}

4.Scala访问修饰符

public 公共的 都可见
protected 自己及子类可见
private 仅自己可见

#Scala中默认不写 修饰符都是public

修饰符作用域 可以更加精准的实现控制

 private[this] var age:Int =18 

//除了this 其他都是private。

 private[com] var age:Int =18 
//除了com包下面的 其他都是private。

伴生

//todo  在同一个.scala文件中 如果class名字和object的名字一样 就说两者之间形成了伴生关系
//todo  class叫做伴生类  object叫做伴生对象
//todo  伴生关系最大的好处 可以互相访问对象的私有属性
class Student{
  var id:Int =1
  var name:String="miao"
  private[this] var age:Int =18 //私有属性 只有自己可见
}

//object Test01{
//  def main(args: Array[String]): Unit = {
//    val s = new Student
//    println(s.id+"--->"+s.name)
    s.age
//  }
//}

object Student{
  def main(args: Array[String]): Unit = {
    val s = new Student
    println(s.id+"--->"+s.name)
//    println(s.age)
  }
}

5.继承

继承基本语法

  • 继承功能出现 避免重复写代码 提高代码复用率
  • 关键字也是extends
class Person {
    //todo 只有常量才可以override 变量可以直接修改
    var id:Int = 1
    var name: String = "张三"
  //todo final修饰的 子类无法重写
  //todo private修饰的 子类无法重写  子类连看都看不见
//    final val country:String = "China"
//    private val country:String = "China"
    val country:String = "China"

    def sayHello = println("你好!")
}

//todo scala继承也是extends关键字
class Student extends Person {
  //子类可以定义自己的属性和方法
  var score :Double =_
  def sayHDD = println("打游戏")

  //子类也可以对继承于父类的属性和方法进行重写
  override val country: String = "korea"
  name = "정수 연"
  //super在子类中调用父类的方法
  override def sayHello: Unit = println("안녕하세요")
}

object Student{
  def main(args: Array[String]): Unit = {
    val s = new Student
    println(s.name)
    println(s.country)
    s.sayHello
  }
}

6.类型判断与类型转换

object Student{
  def main(args: Array[String]): Unit = {

    val s: Person = new Student

    //todo 类型判断于类型转换
    if(s.isInstanceOf[Student]){
      println("类型已经转换")
      s.asInstanceOf[Student]
    }

    //todo isInstanceOf 可以进行类型判断 但是不精准  只能判断对象是否为指定类以及其子类的对象
    println(s.isInstanceOf[Person])
    println(s.isInstanceOf[Student])
    println(s.isInstanceOf[String])

    //todo 如果需要精准判断  使用getClass ClassOf
    println(s.getClass == classOf[Person])
    println(s.getClass == classOf[Student])
    println(s.getClass == classOf[String])
  }
}

7.抽象类

  • 抽象方法
  • 抽象属性
  • 抽象类
//对于class来说 如果有抽象的属性 或者抽象方法  这个类叫做抽象类 需要使用关键字abstract
abstract class Person {
    var name:String  //如果变量没有初始值 叫做抽象变量 抽象属性
    def sayHello //如果方法没有方法体 叫做抽象方法
}

//子类继承抽象类  要么继续抽象  要么实现抽象
//todo 实现抽象类或者接口方法的快捷键  ctrl+i
class Student extends Person {
  override var name: String = "miao"

  override def sayHello: Unit = println("你好")
}

匿名内部类

直接new 抽象类或者接口 进行实现


//对于class来说 如果有抽象的属性 或者抽象方法  这个类叫做抽象类 需要使用关键字abstract
abstract class Person {
    var name:String  //如果变量没有初始值 叫做抽象变量 抽象属性
    def sayHello //如果方法没有方法体 叫做抽象方法
}

//子类继承抽象类  要么继续抽象  要么实现抽象
//todo 实现抽象类或者接口方法的快捷键  ctrl+i
class Student extends Person {
  override var name: String = "miao"

  override def sayHello: Unit = println("你好")
}

object Test01{
  def main(args: Array[String]): Unit = {
   val p = new Person {
     override var name: String = "james"

     override def sayHello: Unit = println("你好!")
   }

    p.sayHello
  }
}

三、Trait

Trait:特质 特征

  • 相当于java中接口,比接口功能的更加强大。

功能1:当成和java接口一样使用 定义抽象方法

//todo scala中 对应Trait的实现也是使用extends关键字
//todo 类实现多个Trait 第一个使用extends 后面的使用with关键字
class Student1 extends HelloTrait with ByeTrait with Serializable {
  override def sayBye: Unit = println("再见")

  override def sayHello: Unit = println("你好")
}

object Student{
  def main(args: Array[String]): Unit = {
    val s = new Student1
    s.sayHello
    s.sayBye
  }
}

功能2:定义具体的方法 当成通用的工具类

trait LoveUTrait {
  //下面这个方法有方法体  叫做具体的方法
 def sayLove =println("I LOVE YOU!")
}

功能3:字段属性也是类似 既可以定义抽象的 也可以定义具体的

  • 如果Trait中是抽象的 继承的时候就需要实现
  • 如果trait中是具体的 继承的时候可以直接使用

功能4:实例混入trait

  • 让同一个对象的不同实例 拥有不同的能力 在new对象获取实例的时候继承混入trait
class Student{

}
//todo 正常情况下 类继承trait之后 类的所有的实例当然具有了trait里面的方法
//todo 要求类的不同实例有不同的trait
object Student{
  def main(args: Array[String]): Unit = {
    val s1 = new Student with LoveUTrait  //实例混入了一个trait
    s1.sayLove

    val s2 = new Student  with ByeTrait {
      override def sayBye: Unit = println("bye")
    }
    s2.sayBye
  }
}

构造机制与顺序

如果类既继承class 又实现trait 。构造顺序:先父类。再trait 。最后是自己。

class Person {
  println("Person主构造器执行了01")
}

//todo 如果类需要同时继承class和trait 先继承类再继承trait
class Student extends Person with LoveUTrait{
  println("Student主构造器执行了01")
}

object Student{
  def main(args: Array[String]): Unit = {
    val s = new Student
  }
}

以上是关于Scala:基础知识02的主要内容,如果未能解决你的问题,请参考以下文章

Scala:基础知识02

Scala基础学习02

Scala语言专题

为什么Scala是可扩展的?

scala - 最佳实践(02) - 代码洁癖

大数据技术之_27_电商平台数据分析项目_02_预备知识 + Scala + Spark Core + Spark SQL + Spark Streaming + Java 对象池