首页 > 其他分享 >Scala 的学习

Scala 的学习

时间:2023-05-10 21:14:08浏览次数:58  
标签:String Scala object 学习 def println Unit realName

Scala

只是学习无基本理论

安装Scala

装前必须有jdk

windows安装

解压缩 D:dev/scala

配置环境变量

SCALA_HONE

path

cmd检查

Scala -version

直接输入Scala 控制台运行

idea安装与运行Scala

idea-->插件-->scala-->安装-->重启

新建maven项目

catalog-->maven

archetype-->

image

项目结构-->全局库-->添加Scala

image

image

添加应用支持-->scala
add开头
image

image

新建Scala类 选择 object

image

scala 完全面向对象

scala风格与java风格

public class JavaDemo01 {
    public static void main(String[] args) {
        System.out.println("我爱你中国");
    }
}
javac JavaDemo01
object ScalaDemo01{
    def main(args: Array[String]): Unit = {
    print("我爱你中国")
  }
}
scalac ScalaDemo01

终端运行Scala

编码 utf-8

scalac 文件名字--> 生成 文件名字$.class 与 文件名字.class-->调用 文件名字.class

Scala项目启动方式

main函数与extends app特质的区别:

App是scala语言内置的一个特质,使用它,则把对应object内部的整体作为scala main的一部分,有延迟启动的特性。

同时,命令行参数args也作为App特质的一部分,可以被开发者直接使用。而main函数则是scala的默认启动方式。

使用main函数

object ScalaDemo02{
    def main(args: Array[String]): Unit = {
    print("我爱你中国")
  }
}

使用App特质

object ScalaDemo03 extends App{
    print("我爱你中国")
}
object ScalaDemo04 extends App{
    print(args(0))
}

终端运行:

scalac ScalaDemo04.scala
scala ScalaDemo04 lhz

Scala代码与Java代码混用

object ScalaDemo05{
    def main(args: Array[String]): Unit = {
    System.out.println("我爱你中国")
  }
}

在 Scala 代码中 可以直接使用 Java 代码

注意:main 方法使用Scala 风格

变量与常量

object ScalaDemo06{
    def main(args: Array[String]): Unit = {
    // var 变量 修饰符
        var a:Int = 10
    // val 常量 修饰符
    	val b:Int = 10
        
        a = 20
        println(a)
        /**
         *报错
         *reassignment to val
        */
        // b = 20
  }
}

字符串基本使用

object ScalaDemo07{
    def main(args: Array[String]): Unit = {
        var str01:String = "我爱你"
        var str02:String = "中国"
        // java 风格
        println (str01 + str02)
        // 插值方式 与 python 风格比较相像
        var slogan:String = "桃李不言下自成蹊"
        println(s"slogan >>> $slogan")
        
        println("""
        	|我爱你中国
        	|亲爱的母亲
        """.strpMargin)
  }
}

选择结构

object ScalaDemo08{
    def main(args: Array[String]): Unit = {
        var weekDay:Int = 1
        if (weekDay == 1){
            println("周一")
        }else if (weekDay == 2){
            println("周二")
        }else if (weekDay == 3){
            println("周三")
        }else if (weekDay == 4){
            println("周四")
        }else if (weekDay == 5){
            println("周五")
        }else if (weekDay == 6){
            println("周六")
        }else{
            println("周日")
  	}
  }
}

循环结构

object ScalaDemo09{
    def main(args: Array[String]): Unit = {
        var count:Int = 0
        while(count<5){
            println(count)
            count += 1
        }
  }
}
object ScalaDemo10{
    def main(args: Array[String]): Unit = {
        //Range 1 to 5
        println(1 to 5)
        println(1.to(5))
        println(1 until 5)
        println(1.until(5))
        
        // <- 赋值
        for (i <- 0 until 5){
            println(i)
        }
        println("--------------------^_ ~ _^----------------------")
        // 求偶数值
        for (i <- 0 until 10){
            if (i % 2 == 0){
                println(i)
            }
        }
        println("--------------^_ ~ _^----------------")
        for (i <- 0 until 10 if i % 2 == 0){
            println(i)
        }
        println("--------------^_ ~ _^----------------")
        for (i <- 0 until 10 by(2)){
            println(i)
        }
        println("--------------------^_ ~ _^----------------------")
        // 增强for循环
        var courses = Array("Hadoop","Hive","Sqoop","Flume","Hbase","Phoenix","Presto")
        for (course <- courses){
            println(course)
        }
  }
}

函数

无参数 无返回值

object ScalaDemo01{
    def main(args: Array[String]): Unit = {
    	sayHi()
  }
    // def 函数定义关键字 
    // sayHI 函数名称
    // () 函数参数
    // :后面的数据类型为返回值数据类型
    // : Unit 无返回值的数据类型占位符
    // {} 方法体
    private def sayHi(): Unit = {
      println("无参数 无返回值 函数 sayHi")  
    }
}

有参数 无返回值

object ScalaDemo02{
    def main(args: Array[String]): Unit = {
   	 sayHi(msg = "hello word")
  }
    private def sayHi(msg:String): Unit = {
        println("有参数 无返回值 函数 sayHi")
        println(s"参数是 >>> ${msg}")
    }
}

默认参数 无返回值

object ScalaDemo03{
    def main(args: Array[String]): Unit = {
    	sayHi()
        sayHi(msg = "hello")
  }
    private def sayHi(msg:String = "hi"): Unit = {
        println("默认参数 无返回值 函数 sayHi")
        println(s"参数是 >>> ${msg}")
    }
}
# 输出结果:
默认参数 无返回值 函数 sayHi
参数是 >>> hi
默认参数 无返回值 函数 sayHi
参数是 >>> hello

有参数 有返回值

object ScalaDemo04{
    def main(args: Array[String]): Unit = {
    	println(sum(10,20))
  }
    def sum(a:Int , b:Int): Int ={
        // 函数的最后一行为返回值
        a+b
    }
}

可变参数 无返回值

public class JavaDemo04{
     public static void main(String[] args) {

    }
    private static String
}
object ScalaDemo05{
    def main(args: Array[String]): Unit = {
    	println(format())
        println(format(numbers = 1))
        println(format(numbers = 1,2))
  }
    def format(numbers: Int*): String = {
        // var result:String = null
        var result:Int = 0
    	if(numbers.size > 0){
            for(number <- numbers){
                result += number
            }
        }
        result
    }
}

面向对象

类与对象

object ScalaDemo01{
    def main(args: Array[String]): Unit = {
   		val person = new Person01
        person.name = "lhz"
        println(person.name)
  }
    class Person01{
        // _ 代表着 占位符 占位
        var name:String = _
    }
}

封装

scala中属性、方法默认为public

private只在类的内部和伴生对象中可用

protected,同类、子类可以访问,同包无法访问

private[包名],增加包访问权限,包名下的其他类也可以使用

Scala提供进一步的封装,“public”属性底层实际上都是private,访问时本质上是调用了xxx(get) 和 xxx_eq$(set) 方法,

但这里的方法名并不是getXXX和setXXX,由于一些Java框架会利用反射调用getXXX和setXXX,

因此Scala也提供了上面提到过的@BeanProperty注解去生成某属性的这两个方法,

但注意@BeanProperty不能加在private修饰的属性上,

可以理解为由于“public”本身就是private,将变量修饰为private然后再提供getter、setter方法比较冗余,Scala不推荐这样做。

// 假 封装
object ScalaDemo02{
    def main(args: Array[String]): Unit = {
   		val person = new Person02
        person.setName("lhz")
        println(person.getName)
        person.name = "lz"
        println(person.name)
  }
    class Person02{
        // _ 代表着 占位符 占位
        @BeanProperty
        var name:String = _
    }
}
// private 不推荐
// 手写 set get 方法
object ScalaDemo03 {
  def main(args: Array[String]): Unit = {
   val person = new Person03
   person.setName("lhz")
   println(person.getName)
  }
  class Person03{
    private var name: String = _

    def getName: String = {
      this.name
    }

    def setName(name: String): Unit ={
      this.name = name
    }
  }
}

java代码混用

public class Person04 {
    private String realName;

    public String getRealName() {
        return realName;
    }

    public void setRealName(String realName) {
        this.realName = realName;
    }
}
object ScalaDemo04 {
  def main(args: Array[String]): Unit = {
    val person = new Person04
    person.setRealName("李昊哲")
    println(person.getRealName)
  }
}

构造函数

object ScalaDemo05{
    def main(args: Array[String]): Unit = {
   		val person01 = new Person05("person01","220422198311222011")
    val person02 = new Person05("person02","220422198311222011",15311484567L)
    val person03 = new Person05("person02","220422198311222011","我爱你中国")
    val person04 = new Person05("person02","220422198311222011",15311484568L,"我爱你中国")
    println(person01)
    println(person02)
    println(person03)
    println(person04)
  }
}
    //主构造函数
class Person05(val realName:String, val idCard:String){
	println("Person05 主构造器 执行了")
    var mobile: Long= _
    var slogan: String= _
        
    // 辅助构函数 辅助构函数不能有类型注解
    def this(realName: String , idCard: String, mobile: Long)={
            // 辅助构函数 的 第一行代码必须调用 主构造函数 或者其他 辅助构函数
            this(realName,idCard)
            this.mobile = mobile
        }
        def this(realName: String , idCard: String, Slogan: String)={
            // 辅助构函数 的 第一行代码必须调用 主构造函数 或者其他 辅助构函数
            this(realName,idCard)
            this.slogan = slogan
        }
        def this(realName: String , idCard: String, mobile: Long, slogan: String)={
            // 辅助构函数 的 第一行代码必须调用 主构造函数 或者其他 辅助构函数
            this(realName,idCard,mobile)
            this.slogan = slogan
        }
    override def toString: String =
    this.getClass.getSimpleName +
      ", realName:" + realName +
      ", idCard:"+ idCard +
      ", mobile:" + mobile +
      ", slogan:"  + slogan

}

运行结果

Person05 主构造器 执行了
Person05 主构造器 执行了
Person05 主构造器 执行了
Person05 主构造器 执行了
Person05, realName:person01, idCard:220422198311222011, mobile:0, slogan:null
Person05, realName:person02, idCard:220422198311222011, mobile:15311484567, slogan:null
Person05, realName:person02, idCard:220422198311222011, mobile:0, slogan:我爱你中国
Person05, realName:person02, idCard:220422198311222011, mobile:15311484568, slogan:我爱你中国

继承

object ScalaDemo06 {
  def main(args: Array[String]): Unit = {
    val worker = new Worker("李昊哲", "15311484568", "架构师")
    println(worker)
  }
}

// 主构造函数
class Person06(val realName: String, val mobile: String) {

  println("Person06 主构造器 执行了")

  override def toString: String =
    this.getClass.getSimpleName +
      ", realName:" + realName +
      ", mobile:" + mobile
}

class Worker(realName: String, mobile: String, job: String) extends Person06(realName, mobile) {
  println("Worker 主构造器 执行了")

  override def toString: String =
    this.getClass.getSimpleName +
      ", realName:" + realName +
      ", mobile:" + mobile +
      ", job:" + job
}

抽象类

object ScalaDemo07 {
  def main(args: Array[String]): Unit = {
    val teacher = new Teacher
    teacher.realName = "李昊哲"
    teacher.mobile = "15311484568"
    println(teacher)
    teacher.hi()
  }
}

abstract class Person07() {

  println("Person07 主构造器 执行了")

  var realName: String
  var mobile: String

  def hi(): Unit

  override def toString: String =
    this.getClass.getSimpleName +
      ", realName:" + realName +
      ", mobile:" + mobile
}

class Teacher extends Person07 {
  println("Teacher 主构造器 执行了")

  override def toString: String =
    this.getClass.getSimpleName +
      ", realName:" + realName +
      ", mobile:" + mobile

  override var realName: String = _
  override var mobile: String = _

  override def hi(): Unit = {
    println("接着奏乐 接着舞")
  }
}

伴生类与伴生对象

scala中的类不能定义静态成员,而代之以定义单例对象来替代
单例对象通过object关键字来声明
单例对象中的所有方法,可以直接通过object单例对象的名字直接来调用。
一个单例对象可以绑定在一个类,当单例对象和某个类写在同一个源文件且共享一个名字,它们就产生了绑定关系。
此时单例对象称之为该类的伴生对象,类称之为该对象的伴生类。

类和它的伴生对象可以互相访问其私有成员
单例对象不能new,所以也没有构造参数
可以把单例对象当做java中可能会用到的静态方法工具类。
作为程序入口的方法必须是静态的,所以main方法必须处在一个单例对象中,而不能写在一个类中。

object ScalaDemo08 {
  def main(args: Array[String]): Unit = {
    Food.printMsg()
    new Food().printSlogan()
  }
}

class Food {
  private val msg: String = "hello"
  def printSlogan(): Unit = {
    println(Food.slogan)
  }
}

object Food {
  private val slogan: String = "桃李不言下自成蹊"
  def printMsg(): Unit = {
    println(new Food().msg)
  }
}

apply

object ScalaDemo09 {
  def main(args: Array[String]): Unit = {
    // Drink() 相当于 Drink.apply
    Drink()
    new Drink().apply()
  }
}

class Drink{
  def apply(): Unit = {
    println("class Food 执行...")
  }
}

object Drink {
  def apply(): Unit = {
    println("object Food 执行...")
  }
}

标签:String,Scala,object,学习,def,println,Unit,realName
From: https://www.cnblogs.com/dream-come-true/p/17389339.html

相关文章

  • mall学习笔记(3)
    今天想调取一个product的attribute。已知一个product有数据库表里的属性,还有一些手动添加的attribute。attribute_category将attribute根据不同的商品类别分为几组,然后attribute_value建立attribute和其值的一个映射。1. mybatis的example.createCriteria()方法学习记录_VVAIV......
  • 关于ChatGPT高效学习的特别说明
    文/高扬 今天在和大伙一起基于飞书,将《ChatGPT实用指南》改造成在线文档,给大家汇报下成果。 整体的排版工作仍由谷雨负责,看得出她在职场上没少写文档,排版很精美。    我们特别设计了一个个性化的目录,你看:    这份在线文档预计4月26号或27号正式发布,敬......
  • 基于机器学习和人工智能的数据质量测试工具
    一、比较知名的工具(非完全免费)Trifacta:Trifacta:是一种自动数据质量检测和数据预处理工具,它使用机器学习算法来自动识别数据中的潜在问题,并建议数据清理操作。TalendDataQuality:TalendDataQuality是一种数据质量和数据清理工具,它使用机器学习算法来自动识别数据中的问题,......
  • 学习了 python的数据爬取以及数据的可视化。
     Python中国大学排名数据分析与可视化;【源代码程序】importrequestsfrombs4importBeautifulSoupasbsimportpandasaspdfrommatplotlibimportpyplotaspltdefget_rank(url):   count=0   rank=[]   headers={       "user-agen......
  • python基础学习-if-while-for-input-print
    """字符串格式化:方式2:f“{变量/表达式}{变量/表达式}”不理会类型,不做精度控制方式1:”%占位“%(变量/表达式)包括(%d%f%s)%m.nm控制显示位数,n控制精度小数点后几位,四舍五入"""name="家和"age=20print(f"我是{name},我{age}岁了")"""inp......
  • python基础学习-JSON
    """JSON:轻量级数据交互格式本质上是带有特定格式的字符串主要功能:在各种编译语言流通的数据格式,负责不同编译语言之间的数据传递和交互中转数据格式格式:{"name":"admin","age":18}字典或[{"name":"admin","age":18},{"name":"admin",&quo......
  • python基础学习-模块导入
    """一模块导入:[from模块名]import[模块|类|变量|函数|*][as别名]常用:import模块名from模块名import方法|类|变量from模块名import*import模块名as别名from模块名import功能名as别名如果模块中有_all_变量,当使用fromxxximport*导入时,只能......
  • python基础学习-列表
    """数据容器""""""列表:list#字面量[元素1,元素2,元素3]#定义变量变量名称=[元素1,元素2,元素3]#定义空列表变量名称=[]变量名称=list()#列表可以存储多个数据,且可以为不同的数据类型,支持嵌套my_list=[1,[2,3],4]下标索引,从0开始my_list=["it","my",34,......
  • python基础学习-序列-切片
    """序列:连续,有序,可使用下标索引的数据容器列表,元组,字符串切片:序列:[起始下标:结束下标:步长]起始留空,从0,结束留空,截至到尾,不含结束下标步长为1,一个个取,可省步长为2,跳一个元素取步长为n,跳n-1个元素取取最后一个元素,下标为-1element=my_list[-1]等同于序列反转result=my_l......
  • python基础学习-字符串
    """str字符串下标索引,从0开始my_str="hello"my_str[0]取"h"可以反向索引,从后往前,从-1开始,一次递减my_str[-1]取o不可修改的数据容器方法:1.查找某元素下标字符串.index(字符串)2.字符串替换新字符串=字符串.replace(字符串1,字符串2)字符串2替换字符串1,字符......