使用implicitly demo
泛型: 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的更多相关文章
- React报错之Parameter 'props' implicitly has an 'any' type
正文从这开始~ 总览 当我们没有为函数组件或者类组件的props声明类型,或忘记为React安装类型声明文件时,会产生"Parameter 'props' implicitly has an ...
- 通过一个demo了解Redux
TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象:使用数据流能帮我们明确了行为对应的响应,这和react的状态可预测的思想是不谋而合的. 常见的数据流框架 ...
- 很多人很想知道怎么扫一扫二维码就能打开网站,就能添加联系人,就能链接wifi,今天说下这些格式,明天做个demo
有些功能部分手机不能使用,网站,通讯录,wifi基本上每个手机都可以使用. 在看之前你可以扫一扫下面几个二维码先看看效果: 1.二维码生成 网址 (URL) 包含网址的 二维码生成 是大家平时最常接触 ...
- 在线浏览PDF之PDF.JS (附demo)
平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html#skill 下载地址:http://mozilla.gith ...
- 【微框架】Maven +SpringBoot 集成 阿里大鱼 短信接口详解与Demo
Maven+springboot+阿里大于短信验证服务 纠结点:Maven库没有sdk,需要解决 Maven打包找不到相关类,需要解决 ps:最近好久没有写点东西了,项目太紧,今天来一篇 一.本文简介 ...
- vue双向数据绑定原理探究(附demo)
昨天被导师叫去研究了一下vue的双向数据绑定原理...本来以为原理的东西都非常高深,没想到vue的双向绑定真的很好理解啊...自己动手写了一个. 传送门 双向绑定的思想 双向数据绑定的思想就是数据层与 ...
- Android Studio-—使用OpenCV的配置方法和demo以及开发过程中遇到的问题解决
前提: 1.安装Android Studio(过程略) 2.官网下载OpenCV for Android 网址:http:opencv.org/downloads.html 我下载的是下图的版本 3. ...
- iOS之ProtocolBuffer搭建和示例demo
这次搭建iOS的ProtocolBuffer编译器和把*.proto源文件编译成*.pbobjc.h 和 *.pbobjc.m文件时,碰到不少问题! 搭建pb编译器到时没有什么问题,只是在把*.pro ...
- 钉钉开放平台demo调试异常问题解决:hostname in certificate didn't match
今天研究钉钉的开放平台,结果一个demo整了半天,这帮助系统写的也很难懂.遇到两个问题: 1.首先是执行demo时报unable to find valid certification path to ...
随机推荐
- virtualenv最佳实战
一 系统环境 windows 10 64-bit 安装python 2.7.18 和python 3.8两个版本 二 安装 默认会把virtualenv安装到系统默认python版本中 pip ins ...
- java实现邮箱发送信息--验证码的发送(163邮箱)
1.maven环境 <!-- 发送邮件 --> <dependency> <groupId>javax.mail</groupId> <artif ...
- 23种设计模式 - 行为变化(Command - Visitor)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 行为变化 Command 动机(Motivation) 在软件构建过程中,"行为请求者" ...
- Android开发之常用必备工具类图片bitmap转成字符串string与String字符串转换为bitmap图片格式
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...
- 银行应用USB Key身份认证方案
前言:本文为USB Key的厂商SafeNet公司提供的宣传稿件,并不代表本博客作者的观点和看法. 本文的技术解决方案使用的是SafeNet自身的产品,虽然这个产品支持数字签名和PKI体系,可生成并储 ...
- C III
http://cossacksworld.ucoz.co.uk/load/c_iii_files/79 http://cossacksworld.ucoz.co.uk/load/c_iii_files ...
- HDU-1754-I Hate It(单点更新+区间查询)
很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有 ...
- 深入了解Netty【三】Netty概述
1.简介 Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. Netty是一个NIO客户端服务器框架,它支持快速.简单地开发协议服务器和客户端等网络应用程序 ...
- Java8 ParallelStream
ParallelStream 并行流就是一个把内容拆分成多个数据块,用不同线程分别处理每个数据块的流.对收集源调用parallelStream方法就能将集合转换为并行流. 并行流 并行流和顺序流转换 ...
- ubuntu nodejs+npm 前端环境部署
起因 安装node.js / npm (npm:6.9.0 / nodejs:v10.21.0) 软连接的添加和删除 node.js 介绍 Node.js是一个Javascript运行环境(runti ...