1. 程式人生 > >Scala操作有理數運算

Scala操作有理數運算

最近在學Scala,準備入坑大資料的學習了,感覺Spark比Hadoop火一點,加上我早已經學完Java了,所以我想嘗試新的挑戰,就去學習Scala這門語言了. 因為Spark和Kafka啥的就是用Scala寫的原始碼,加上我想學習一下函數語言程式設計,不怎麼想用Java的lambda表示式,儘管Java8之後這些功能都跟上來了.綜上所述,我最終選擇了學習Scala.其實語言只是其次的,只是一門工具而已,當然也要好好掌握它的精髓,不過更重要的是藉助Scala這門神奇的語言帶我入門大資料的學習,這樣才是關鍵. 這還是我關於Scala的第一篇部落格,我是邊看書邊看視訊邊敲程式碼來學習的,後期再跟進專案吧,先系統學一遍再說.先簡單介紹一下Scala吧! 名稱來自scalable language,意為可伸縮的語言 是一門綜合了面向物件和函數語言程式設計概念的靜態型別的程式語言 scala程式設計便於擴充套件和定製 scala有自己的類庫 scala能屈能伸(結合了面向物件和函數語言程式設計).在scala中,函式值就是物件 每一個值都是物件,每一個操作都是方法呼叫 函數語言程式設計語言 1.函式是一等(first-class)的值 2.程式中的操作應該將輸入值對映成輸出值,而不是當場(in place)修改資料(方法不能有副作用,指稱透明) 不可變資料結構是函數語言程式設計的基石之一,如不可變的list,tuple,map,set 特點:相容性,精簡性,高階抽象,靜態型別 scala和java可以互相操作,也就是說可以互相呼叫各自的類庫,可以在專案中採用Scala和Java混編. 配置環境和在idea裡面建專案就不說了,都可以搜到,這裡直接看一個我寫的分數操作的例子

package Chapter1

object test5 extends App {

  //構造分數以及各種運算操作
  class Rational(n: Int, d: Int) {
    require(d != 0)
    private val g = gcd(n.abs, d.abs)
    val numer: Int = n / g
    val denom: Int = d / g

    def this(n: Int) = this(n, 1) // auxiliary constructor

    //方法過載
    def +(i: Int): Rational =
      new Rational(numer + denom * i, denom)

    def +(that: Rational): Rational =
      new Rational(
        numer * that.denom + that.numer * denom,
        denom * that.denom
      )

    def -(i: Int): Rational =
      new Rational(numer - i * denom, denom)

    def -(that: Rational): Rational =
      new Rational(
        numer * that.denom - that.numer * denom,
        denom * that.denom
      )

    def *(i: Int): Rational =
      new Rational(i * numer, denom)

    def *(that: Rational): Rational =
      new Rational(
        numer * that.numer,
        denom * that.denom
      )

    def /(i: Int): Rational =
      new Rational(numer, denom * i)

    def /(that: Rational): Rational =
      new Rational(
        numer * that.denom,
        denom * that.numer
      )

    //重寫toString方法
    override def toString =
      if (denom == 1) numer + "" else numer + "/" + denom

    //找最大公約數,便於後期化簡
    private def gcd(a: Int, b: Int): Int =
      if (b == 0) a else gcd(b, a % b)
  }

  //2*x<=>2.*(x),Int類並沒有接收Rational類的乘法方法,因為Rational並不是scala裡面的標準類
  //隱式轉換,可以執行2*x操作了
  //不能定義在Rational類裡面,需要定義在作用域裡面,否則無效
  implicit def intToRational(x: Int) = new Rational(x)

  val x = new Rational(2, 1)
  val y = new Rational(3, 9)
  println(x + y)
  println(x - y)
  println(x * y)
  println(x / y)
  println(x / 2)
  println(2 * x)
}

輸出: 7/3 5/3 2/3 6 1 4 入坑大資料,從Scala開始!