Scala操作有理数运算

本文分享了一位程序员从Java转向Scala的学习经历,详细介绍了选择Scala作为大数据学习起点的原因,包括其在Spark和Kafka中的核心地位及函数式编程特性。通过一个分数操作的代码实例,展示了Scala的面向对象和函数式编程能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在学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开始!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值