泛型:  Context Bounds

//  //定义一个隐式值, 这个值不能少, 要不找不到比较的对象
implicit val personCompartor = new Ordering[Person] {
override def compare(p1: Person, p2: Person): Int = {
p1.age - p2.age
}
} def main(args: Array[String]): Unit = { val jack = new Person("jack", 20)
val tom = new Person("tom", 30) val compareComm1 = new CompareComm(jack, tom)
println(compareComm1.greater)
println("---------------------") val compareComm2 = new CompareComm2(jack, tom)
println(compareComm2.geatter) println("--------------------------")
val compareComm3 = new CompareComm3(jack, tom)
println(compareComm3.greatter) } } // 一个普通漫的personl类
class Person(val name: String, val age: Int) {
override def toString: String = this.name + "\t" + this.age
} /** 方式1
* implicit comparetor: Ordering[T] 是一个隐式参数
* 前面Ordered , Ordering
* Ordered和Ordering的区别
* Ordering继承了java中的Comparator接口,而Ordered继承了java的Comparable接口。
* 在java中的Comparator是一个外部比较器(需要定义一个类来实现比较器),而Comparable则是一个内部比较器,在类内部重载compareTo函数。
*
*/ class CompareComm[T: Ordering](obj1: T, obj2: T)(implicit comparetor: Ordering[T]) { def greater = if (comparetor.compare(obj1, obj2) > 0) obj1 else obj2
} /**
* 方式二
* 隐式参数也可以直接写到方法中
*/ class CompareComm2[T: Ordering](obj1: T, obj2: T) {
def geatter = {
def f1(implicit comparetor: Ordering[T]) = comparetor.compare(obj1, obj2) if (f1 > 0) obj1 else obj2
}
} /**
* 方式3,使用implicitly语法糖,最简单(推荐使用)
*/ class CompareComm3[T: Ordering](obj1: T, obj2: T) {
def greatter = {
//发生隐式转换,获取到隐式值 personComparetor
val comparetor = implicitly[Ordering[T]] if (comparetor.compare(obj1, obj2) > 0) obj1 else obj2 }
}

  

模式匹配日志:

  //标准模式匹配, 可以在匹配中读取变量名称, 模式中也可是设置守卫, 可以变量赋值_newVa
def judgeGrade(name: String, grade: String) {
grade match {
case "A" => println(name + ", you are excellent")
case "B" => println(name + ", you are good")
case "C" => println(name + ", you are just so so")
case _newValu if name == "leo" => println(name + ", you are a good boy, come on ,_newValu: " + _newValu)
case _ => println("you need to work harder")
}
} judgeGrade("leo", "D") //类型模式匹配
def test(e: Exception): Unit = {
e match {
case e1: IllegalArgumentException => println("IllegualArgument")
case e2: FileNotFoundException => println("FileNotFoundExceptino")
case e3: NullPointerException => println("NullPointer")
case _: Exception => println("common Exception")
} } //对 Array 进行模式匹配
def greeting(arr: Array[String]) {
arr match {
case Array("Leo") => println("Hi, Leo!")
case Array(girl1, girl2, girl3) => println("Hi, girls, nice to meet you. " + girl1 + " and " + girl2 + " and " + girl3)
case Array("Leo", _*) => println("Hi, Leo, please introduce your friends to me.")
case _ => println("hey, who are you?")
}
} //对 List 进行模式匹配
def greeting(list: List[String]) {
list match {
case "Leo" :: Nil => println("Hi, Leo!") //一个元素, 后面是 nil
case girl1 :: girl2 :: girl3 :: Nil => println("Hi, girls, nice to meet you. " + girl1 + " and " + girl2 + " and " + girl3)
case "Leo" :: tail => println("Hi, Leo, please introduce your friends to me.")
case _ => println("hey, who are you?")
}
} //case Class 模式匹配
class Person case class Teacher(name: String, subject: String) extends Person case class Student(name: String, classroom: String) extends Person def judgeIdentify(p: Person) {
p match {
case Teacher(name, subject) => println("Teacher, name is " + name + ", subject is " + subject)
case Student(name, classroom) => println("Student, name is " + name + ", classroom is " + classroom)
case _ => println("Illegal access, please go out of the school!")
}
} //Option 模式匹配
val grades = Map("Leo" -> "A", "Jack" -> "B", "Jen" -> "C") def getGrade(name: String) {
val grade = grades.get(name)
grade match {
case Some(grade) => println("your grade is " + grade)
case None => println("Sorry, your grade information is not in the system")
}
}

使用implicitly demo的更多相关文章

  1. React报错之Parameter 'props' implicitly has an 'any' type

    正文从这开始~ 总览 当我们没有为函数组件或者类组件的props声明类型,或忘记为React安装类型声明文件时,会产生"Parameter 'props' implicitly has an ...

  2. 通过一个demo了解Redux

    TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象:使用数据流能帮我们明确了行为对应的响应,这和react的状态可预测的思想是不谋而合的. 常见的数据流框架 ...

  3. 很多人很想知道怎么扫一扫二维码就能打开网站,就能添加联系人,就能链接wifi,今天说下这些格式,明天做个demo

    有些功能部分手机不能使用,网站,通讯录,wifi基本上每个手机都可以使用. 在看之前你可以扫一扫下面几个二维码先看看效果: 1.二维码生成 网址 (URL) 包含网址的 二维码生成 是大家平时最常接触 ...

  4. 在线浏览PDF之PDF.JS (附demo)

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html#skill 下载地址:http://mozilla.gith ...

  5. 【微框架】Maven +SpringBoot 集成 阿里大鱼 短信接口详解与Demo

    Maven+springboot+阿里大于短信验证服务 纠结点:Maven库没有sdk,需要解决 Maven打包找不到相关类,需要解决 ps:最近好久没有写点东西了,项目太紧,今天来一篇 一.本文简介 ...

  6. vue双向数据绑定原理探究(附demo)

    昨天被导师叫去研究了一下vue的双向数据绑定原理...本来以为原理的东西都非常高深,没想到vue的双向绑定真的很好理解啊...自己动手写了一个. 传送门 双向绑定的思想 双向数据绑定的思想就是数据层与 ...

  7. Android Studio-—使用OpenCV的配置方法和demo以及开发过程中遇到的问题解决

    前提: 1.安装Android Studio(过程略) 2.官网下载OpenCV for Android 网址:http:opencv.org/downloads.html 我下载的是下图的版本 3. ...

  8. iOS之ProtocolBuffer搭建和示例demo

    这次搭建iOS的ProtocolBuffer编译器和把*.proto源文件编译成*.pbobjc.h 和 *.pbobjc.m文件时,碰到不少问题! 搭建pb编译器到时没有什么问题,只是在把*.pro ...

  9. 钉钉开放平台demo调试异常问题解决:hostname in certificate didn't match

    今天研究钉钉的开放平台,结果一个demo整了半天,这帮助系统写的也很难懂.遇到两个问题: 1.首先是执行demo时报unable to find valid certification path to ...

随机推荐

  1. Dubbo详解

    什么是DubboDubbo是一个分布式服务框架,致力于提供高性能和透明化的远程服务调用方案,这容易和负载均衡弄混,负载均衡是对外提供一个公共地址,请求过来时通过轮询.随机等,路由到不同server.目 ...

  2. 数据中台实战(一):以B2B电商亿订为例,谈谈产品经理视角下的数据埋点

    本文以B2B电商产品“亿订”为实例,与大家一同谈谈数据中台的数据埋点. 笔者所在公司为富力环球商品贸易港,是富力集团旗下汇聚原创设计师品牌及时尚买手/采购商两大社群,通过亿订B2B电商.RFSHOWR ...

  3. 深入了解Redis(3)-对象

    Redis主要的数据结构有简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合,等等.但Redis并没有直接使用这些数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个 ...

  4. 类的加载,链接和初始化——1运行时常量池(来自于java虚拟机规范英文版本+本人的翻译和理解)

    加载(loading):通过一个特定的名字,找到类或接口的二进制表示,并通过这个二进制表示创建一个类或接口的过程. 链接:是获取类或接口并把它结合到JVM的运行时状态中,以让类或接口可以被执行 初始化 ...

  5. 01.图文理解RDB和AOF两种持久化机制

    一.RDB和AOF两种持久化机制的介绍 RDB:对redis中的数据执行周期性的持久化,每隔一个时刻生成一个RDB文件,这个RDB文件包含这个时刻所有的数据. AOF:记录每条写入命令,以append ...

  6. googleEarth

    中国航天科技集团有限公司 http://www.spacechina.com/n25/n144/n210/index.html Celestia [官网]: https://celestia.spac ...

  7. Mongos WoW

    http://blog.csdn.net/yuleslie/article/details/7430094 https://github.com/mangostwo/ https://www.getm ...

  8. zookeeper与分布式系统

    1.1. 分布式系统基础知识 一个tomcat打天下的时代,不能说完全淘汰了,在一个管理系统,小型项目中还经常使用,这并不过分,出于成本的考虑,这反而值得提倡. 1.1.1.   分布式系统是什么 分 ...

  9. 关于ES6的let、const那些事儿

    Babel 转码器 Babel是广泛使用的一个ES6转换器,将ES6代码转换成ES5代码,从而实现在老版本的浏览器执行. let和const命令 let所声明的变量只在let命令所在的代码块内是有效的 ...

  10. leetcode刷题-67二进制求和

    题目 给你两个二进制字符串,返回它们的和(用二进制表示). 输入为 非空 字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1" ...