scala implicit 学习简记

1 什么情况下会发生隐式转化

总的来说就是定义了,用到了。详细情况用下面几个例子来演示。

1.1 第一种情况

package com.cma.implicits

import java.io.File

object ImplicitsWhen {

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

//定义并导入两个隐式转化函数,如果需要,扩展的方法可以直接被file对象使用

implicit def file2FirstRichFile(file: File) = new FirstRichFile(file)

implicit def file2SecondRichFile(file: File) = new SecondRichFile(file)

val file = new File("E:\\hosts.txt")

//调用第一个隐式转化

println(file.readAllLine)

//调用第二个隐式转化,然后再调用第一个隐式转化

println(file.showAllLine.readAllLine)

}

class FirstRichFile(file: File) {

println("进入FirstRichFile ... ")

def readAllLine = scala.io.Source.fromFile(file).mkString

}

class SecondRichFile(file: File) {

println("进入SecondRichFile ...")

def showAllLine = {

println(scala.io.Source.fromFile(file).mkString)

//SecondRichFile object 隐式转化后的对象

//this

//File object,隐式转化之前的对象。目的是进行链式操作

file

}

}

}

1.2 第二种情况

package com.cma.implicits

object ImplicitWhenSecond {

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

/*

* sqrt求平方根这个方法的输入是Double类型,

* 下面的代码会把整形4先转化为Double

*/

val sqrt = scala.math.sqrt(4)

println(sqrt)

}

}

1.3 第三种情况

package com.cma.implicits

object DefaultValue {

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

implicit val from : String = "unknown"

val content : String = "hello,baby!"

readLetter(content)

}

def readLetter(content : String)(implicit from : String) = {

println(content)

println(from)

}

}

package com.cma.implicits

object ClassAsDefaultValue {

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

val user = User(1 , "flankwang")

implicit val livingCost = new LivingCost(850 , 300 , 1500)

implicit val xxx = "QQ"

showLivingCost(user)

}

def showLivingCost(user : User)(implicit livingCost : LivingCost , xxx : String) = {

println("用户 : " + user.name + user.id + "月预算清单 : ")

println("rent :" + livingCost.rent + ", traffic : " + livingCost.traffic +",food : " +livingCost.food)

println(xxx)

}

case class User(id : Int , name : String)

case class LivingCost(rent : Int , traffic : Int , food : Int)

}

1.4 第四种情况(context bond使用)

package com.cma.implicits

object ContextBound {

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

println(smaller(1)(2))

println(smaller(new User(1))(new User(2)))

}

/**

* first : 第一个参数

* second : 第二个参数

* order : 一个隐式转化函数,输入是T,输出是Ordered[T]

* 这也是ContextBound的概念。

* first second 需要比较大小,但是二者中都没有"<"这样的操作。怎么办呢?,T是没有,

* 但是Ordered[T]中有,只要我们把T =>Ordered[T]不就可以了吗。

* 对,我们这里就是这样干的。

* 还有一点很重要 Ordered[T]是一个trait,集成了JAVA的Comparable,重写compareTo

* (def compareTo(that: A): Int = compare(that)),这里compare是一个抽象方法

* 。<   > 等等方法的定义中使用到了compare.这就要求我们的T实现compare抽象方法

*/

def smaller[T](first : T)(second : T)(implicit order : T => Ordered[T]) = {

if(first < second) first else second

}

/**

* id : 用户ID编号

* val id : Int,这里之所以用val ,是为了让that也可以访问id

*/

class User(val id : Int ) extends Ordered[User]{

def compare(that: User): Int = {

if (this.id < that.id)  1 else if(this.id == that.id) 0 else -1

}

override def toString() = {

"userId : "+ id

}

}

}

时间: 2024-12-07 07:15:43

scala implicit 学习简记的相关文章

Scala学习(一)--Scala基础学习

Scala基础学习 摘要: 在篇主要内容:如何把Scala当做工业级的便携计算器使用,如何用Scala处理数字以及其他算术操作.在这个过程中,我们将介绍一系列重要的Scala概念和惯用法.同时你还将学到作为初学者如何浏览Scaladoc文档 1. 使用Scala解释器 2. 用var和val定义变量 3. 数值类型 4. 使用操作符和函数 5. 浏览Scaladoc Scala解释器 启动Scala解释器的步骤如下: 安装Scala 确保scala/bin目录位于系统PATH中 在你的操作系统中

scala implicit class

scala 是一门 scalable 的语言,扩展性很强. implicit 是 scala 的一个关键词,当它被用于 class 时,该类将被认为是implicit class,它可以用来扩展现有类的行为和方法 以下在scala REPL中展示implicit class的作用 scala> "HAL".increment <console>:8: error: value increment is not a member of String "HAL&

Scala系统学习(三):Scala基础语法

如果您熟悉Java语言语法和编程,那么学习Scala将会很容易.Scala和Java之间最大的句法差异在于行结束字符的分号(;) 是可选的. 当编写Scala程序时,它可以被定义为通过调用彼此的方法进行通信的对象的集合.现在我们简单地看一下类,对象,方法和实例变量的含义. 对象 - 对象有状态和行为.一个对象是类的一个实例.例如 - 狗有状态:颜色,名称,品种,它行为有:摇摆,吠叫和吃东西. 类 - 可以将类定义为描述与该类相关的行为/状态的模板/蓝图. 方法 - 一个方法基本上是一种行为.一个

Scala语法学习手册

1       快速入门... 2 1.1             分号... 2 1.2             常变量声明... 2 1.2.1         val常量... 2 1.2.2         var变量... 2 1.2.3         类型推导... 3 1.2.4         函数编程风格... 3 1.3             Range. 3 1.4             定义函数... 4 1.5             while.if 4 1.6

Scala 递归学习的例子

为了学习Spark,我开始了学习Scala.加油! 递归的一个题目: 代码: // Why x is Float, but when we use 3.0 for example, it returns error. def XpowN(X:Float,n:Int):Float={ if (n==0) 1 else if (n>0){ if (n%2==0) XpowN(X,n/2)*XpowN(X,n/2) else X*XpowN(X,n-1) } else 1/XpowN(X,-n) }

Scala初步学习

scala语言1.scala特点兼容性,简短,高层级抽象?,和高级的静态类别?1.兼容性,可以和java实施互操作scala的程序可以被编译成JVM(java虚拟机)的字节码,访问Java字段,调用java方法,继承java类和实现java接口,几乎所有的scala代码都依赖于java库 scala与java区别java里面既可以比较原始类型也可以比较参考类型,对于原始类型,java 的==比较值得相等性,如scala对于参考类型,java的==比较的是参看相等性,也就是说两个变量事都指向了,j

Scala 入门学习

Scala 学习 一:环境配置 Scale 官网地址: http://scala-ide.org/download/sdk.html 1: 安装Java JDK 2:安装Scala 3:安装Scala 集成IDE 二: 开始Scala 学习旅程 Hello Scala Demo 1: 新建 Scala 工程,并新建 HelloScala.scala 文件 package com.scala.main /** * Scala 测试1 * * @author zhanghuan * * @creat

scala入门学习之表达式

如果你按照上一篇将每一个代码都亲自敲了一遍的时候,我想你已经对scala有一定的感觉,你会发现它很好用,也很人性化,同时也很灵活,一个语言如果特别的灵活就会很难学习,所以坚持,继续学习. 这一篇我们学习表达式的内容,在上一篇我们其实已经用了一个foreach,下面直接上代码: //条件表达式    println("表达式:if")    val x=1    val a=if(x>0) 1 else 0    println(a)        println("表达

scala基础学习(一)

scala学习 scala与java的不同之处: 1.scala中任何一个操作符都是一个方法. s = 1+2;    可以写作:s=(1).+(2) 2.异常捕获采用模式匹配的方式. try { val f = new FileReader("input.txt") // Use and close file } catch { case ex: FileNotFoundException => // Handle missing file case ex: IOExcepti