前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Scala 基础知识

Scala 基础知识

作者头像
Freedom123
发布2024-03-29 09:40:18
630
发布2024-03-29 09:40:18
举报
文章被收录于专栏:DevOpsDevOps

一. 基础知识

1.apply方法

当类或对象有一个主要用途的时候,apply 方法为你提供了一个很好的语法糖

代码语言:javascript
复制
scala> class Foo {}
defined class Foo

scala> object FooMaker {
     |   def apply() = new Foo
     | }
defined module FooMaker

scala> val newFoo = FooMaker()
newFoo: Foo = Foo@5b83f762  

//或
scala> class Bar {
     |   def apply() = 0
     | }
defined class Bar

scala> val bar = new Bar
bar: Bar = Bar@47711479

scala> bar()
res8: Int = 0
2.单例对象

单例对象用于持有一个类的唯一实例。通常用于工厂模式

代码语言:javascript
复制
object Timer {
  var count = 0

  def currentCount(): Long = {
    count += 1
    count
  }
}

scala> Timer.currentCount()
res0: Long = 1

//单例对象可以和类具有相同的名称,此时该对象也被称为“伴生对象”。我们通常将伴生对象作为工厂使用。

class Bar(foo: String)

object Bar {
  def apply(foo: String) = new Bar(foo)
}
3.函数即对象
代码语言:javascript
复制
object addOne extends Function1[Int, Int] {
     |   def apply(m: Int): Int = m + 1
     | }
defined module addOne

scala> addOne(1)
res2: Int = 2


//类也可以扩展 Function,这些类的实例可以使用()调用。
scala> class AddOne extends Function1[Int, Int] {
     |   def apply(m: Int): Int = m + 1
     | }
defined class AddOne

scala> val plusOne = new AddOne()
plusOne: AddOne = <function1>

scala> plusOne(1)
res0: Int = 2

//可以使用更直观快捷的 extends (Int => Int) 代替 extends Function1[Int, Int]
class AddOne extends (Int => Int) {
  def apply(m: Int): Int = m + 1
}
4. 模式匹配
代码语言:javascript
复制
val times = 1

times match {
  case 1 => "one"
  case 2 => "two"
  case _ => "some other number"
}
5. 匹配类型

你可以使用 match 来分别处理不同类型的值。

代码语言:javascript
复制
def bigger(o: Any): Any = {
  o match {
    case i: Int if i < 0 => i - 1
    case i: Int => i + 1
    case d: Double if d < 0.0 => d - 0.1
    case d: Double => d + 0.1
    case text: String => text + "s"
  }
}
6. 匹配类成员
代码语言:javascript
复制
def calcType(calc: Calculator) = calc match {
  case _ if calc.brand == "hp" && calc.model == "20B" => "financial"
  case _ if calc.brand == "hp" && calc.model == "48G" => "scientific"
  case _ if calc.brand == "hp" && calc.model == "30B" => "business"
  case _ => "unknown"
}
7.样本类(Case Classes)

使用样本类可以方便得存储和匹配类的内容。你不用 new 关键字就可以创建它们

代码语言:javascript
复制
scala> case class Calculator(brand: String, model: String)
defined class Calculator

scala> val hp20b = Calculator("hp", "20b")
hp20b: Calculator = Calculator(hp,20b)

scala> val hp20B = Calculator("hp", "20b")
hp20B: Calculator = Calculator(hp,20b)

scala> hp20b == hp20B
res6: Boolean = true


//使用样本类进行模式匹配
val hp20b = Calculator("hp", "20B")
val hp30b = Calculator("hp", "30B")

def calcType(calc: Calculator) = calc match {
  case Calculator("hp", "20B") => "financial"
  case Calculator("hp", "48G") => "scientific"
  case Calculator("hp", "30B") => "business"
  case Calculator(ourBrand, ourModel) => "Calculator: %s %s is of unknown type".format(ourBrand, ourModel)
}
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一. 基础知识
    • 1.apply方法
      • 2.单例对象
        • 3.函数即对象
          • 4. 模式匹配
            • 5. 匹配类型
              • 6. 匹配类成员
                • 7.样本类(Case Classes)
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
                http://www.vxiaotou.com