一、隐式

    implicit分类:
(1)隐式参数
(2)隐式转换类型
(3)隐式类
特点:让代码变得更加灵活

(一)隐式参数

1、ImplicitTest

object ImplicitTest {
//此参数
def sleep(how:String):Unit = {println(how)} //此参数如果被implicit修饰的话,调用可以不写参数 直接sleep2
def sleep2(implicit how:String = "香啊") = {println(how)} def main(args: Array[String]): Unit = {
sleep("很香") sleep2 implicit val how = "头疼"
sleep2
}
}

结果:

2、ImplicitTest1

//隐式转换类型
object ImplicitTest1 {
//类型转换
implicit def double2Int(d:Double) = {d.toInt} def main(args: Array[String]): Unit = {
val a:Int = 18.8
println(a)
}
}

结果:

3、KelihuaImplicit

object KelihuaImplicit {
//柯理化
def sum(a:Int)(implicit b:Int) = {a + b} def main(args: Array[String]): Unit = {
//定义隐式值
implicit val b = 9
println(sum(1))
}
}

结果:

(二)隐式转换类型

4、FileMain

import java.io.File

//扫描文件的数据条数
object FileMain { //定义隐式转换
implicit def file2RichFile(file:File) = new RichFile(file) def main(args: Array[String]): Unit = {
//1.加载文件
val file = new File("e:/weblog.log") //2.打印条数
println(file.count())
}
}

5、RichFile

import java.io.{BufferedReader, File, FileReader}

class RichFile(file:File) {
def count():Int = {
//读取数据
val fileReader = new FileReader(file)
val bufferedReader = new BufferedReader(fileReader) //计数器
var sum = 0
try {
while (bufferedReader.readLine() != null){
sum += 1
}
} catch {
case _:Exception => sum
} finally {
bufferedReader.close()
fileReader.close()
} sum
}
}

结果:

(三)隐式类

6、ReadImplicit

import scala.io.Source

object ReadImplicit {
//定义隐式类
implicit class FileRead(file:File){
//读取文件
def read = Source.fromFile(file).mkString
} def main(args: Array[String]): Unit = {
val file = new File("e:/weblog.log")
println(file.read)
}
}

结果:

二、泛型

    type
如何定义scala中的泛型?

1、Anything

//加入泛型 T代表任意类型
abstract class Anything[T](m:T)

2、Intthing

class Intthing[Int](m:Int) extends Anything(m) {

}

3、Stringthing

class Stringthing[String](m:String) extends Anything {

}

4、Person

class Person[A,B,C](val age:A,val high:B,val face:C) {

}

5、ScalaTest

object ScalaTest {
def main(args: Array[String]): Unit = {
val p = new Person[Int,Double,Double](18,165.5,99)
println(p.high)
}
}

结果:

三、类型约束

    java中Comparable
Scala中的比较的特质:
Ordered 上界(upper Bounds)
<T extends Person>表示T类型是Person的子类型
<? extends Person>
[T <: Person]此时T是Person的子类,这种形式是上界
[_ <: Person] def pr(list:List[_<:Any]){
list.foreach(print)
} 下界(lower Bounds)
<T super Person>
<? super Person> [T >: Person]
[_ >: Person] 视图界定(View Bounds)
<%
视图界定发生了隐式转换 上下文界定
comparator
scala->ordering
上下文界定发生了隐式转换

(一)java中Comparable

1、Person1

public class Person1 implements Comparable<Person1>{
//定义属性
private String name;
private int age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Person1(String name, int age) {
this.name = name;
this.age = age;
} @Override
public int compareTo(Person1 o) {
//升序
return this.age - o.age;
}
}

2、ComTest

import java.util.ArrayList;
import java.util.Collections;
import java.util.List; public class ComTest{
public static void main(String[] args) {
Person1 p1 = new Person1("Tom",18);
Person1 p2 = new Person1("Mary",16); List<Person1> person = new ArrayList<Person1>();
person.add(p1);
person.add(p2); Collections.sort(person);
for (Person1 p : person) {
System.out.println("名字为:" + p.getName());
}
}
}

结果:

(二)Scala中类型约束

1、上届UpperBounds

//定义一个比较的方式
class CompareInt(a:Int,b:Int){
def compare = if(a > b) a else b
} //定义比较类型
class CompareC[T <: Comparable[T]](o1:T,o2:T){
def compare = if(o1.compareTo(o2) > 0) o1 else o2
} object UpperBounds {
def main(args: Array[String]): Unit = {
val big = new CompareInt(1,2)
System.out.println(big.compare) val comc = new CompareC(Integer.valueOf(1),Integer.valueOf(2))
System.out.println(comc.compare)
}
}

结果:

2、视图界定ViewsBounds

//视图界定
class CompareCC[T <% Comparable[T]](o1:T,o2:T){
def big = if(o1.compareTo(o2) > 0) o1 else o2
} object ViewBounds {
def main(args: Array[String]): Unit = {
//视图界定发生了隐式转换
val comc = new CompareCC(1,2)
println(comc.big)
}
}

结果:

3、上下文界定ContextBounds

class Compp[T:Ordering](o1:T,o2:T)(implicit comt:Ordering[T]){
def big = if(comt.compare(o1,o2) > 0) o1 else o2
} class Personss(val name:String,val age:Int){
override def toString: String = this.name + "," + this.age
} //上下文界定 同样发生了隐式转换
object ContextBounds { //比较器定义 比较规则
implicit val comparatorPersonss = new Ordering[Personss]{
override def compare(x: Personss, y: Personss): Int = x.age - y.age
} def main(args: Array[String]): Unit = {
val p1 = new Personss("Tom",18)
val p2 = new Personss("John",15)
val comc = new Compp(p1, p2)
println(comc.big)
}
}

结果:

Scala高级语法的更多相关文章

  1. Scala进阶之路-Scala高级语法之隐式(implicit)详解

    Scala进阶之路-Scala高级语法之隐式(implicit)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们调用别人的框架,发现少了一些方法,需要添加,但是让别人为你一 ...

  2. 大数据之scala高级语法学习

    协变 案例一: class Animal {} class Bird extends Animal {} class Animal {} class Bird extends Animal {} // ...

  3. scala基本语法和单词统计

    scala 基本语法 1.声明变量 (1)val i = 1 使用val声明的变量值是不可变的,相当于java里final修饰的变量,推荐使用. (2)var i = "hello" ...

  4. 【Scala学习之一】 Scala基础语法

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  5. scala 高级编程

    一.函数式编程 Scala中的函数可以独立存在, 不需要依赖任 何类和对象 def  放在类中就是方法:放在外边就是函数 1.将函数赋值给变量 Scala中的函数是一等公民, 可以独立定义, 独立存在 ...

  6. 02.Scala高级特性:第6节 高阶函数;第7节 隐式转换和隐式参数

    Scala高级特性 1.    课程目标 1.1.   目标一:深入理解高阶函数 1.2.   目标二:深入理解隐式转换 2.    高阶函数 2.1.   概念 Scala混合了面向对象和函数式的特 ...

  7. Scala基础语法 (一)

    如果你之前是一名 Java 程序员,并了解 Java 语言的基础知识,那么你能很快学会 Scala 的基础语法. Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的. 我 ...

  8. tn文本分析语言(三):高级语法

    标签(空格分隔): 未分类 高级操作 1.脚本表达式 用双引号包含的脚本被称为脚本表达式,目前支持嵌入Python. 脚本表达式只能在顺序表达式中使用.代码可以在三个位置存在: |位置|功能|例子| ...

  9. Swift高级语法学习总结(转)

    Swift高级语法学习总结 1.函数 1.1 func funcNmae()->(){} 这样就定义了一个函数,它的参数为空,返回值为空,如果有参数和返回值直接写在两个括号里就可以了 1.2 参 ...

随机推荐

  1. MYSQL 两日期之间的工作日(除去周六日,不考虑节假日)

    select (floor(days/7)*5+days%7      -case when 6 between wd and wd+days%7-1 then 1 else 0 end      - ...

  2. 简单工厂模式(simple factory pattern)

    与一个对象相关的职责通常有3类: 1.对象本身所具有的职责(对象自身所具有的数据和行为) 2.创建对象的职责 3.使用对象的职责: 简单工厂模式的缺点: 1.简单工厂集中了所有产品的创建逻辑,职责过重 ...

  3. error:2014 Commands out of sync; you can't run this command now

    如下错误: 分析原因: 前端ajax请求后台,共用同一个链接. 搜索别人的解决方案:http://blog.csdn.net/grass_ring/article/details/3499402 用m ...

  4. CSS 解决IE6双倍距离BUG

    只要满足下面3个条件才会出现这个BUG: 1)要为块状元素:        2)要左侧浮动:        3)要有左外边距(margin-left): 解决这个BUG很容易,只需要在相应的块状元素的 ...

  5. Python 插件安装

    0.下载Python包文件后,解压缩: 1.cd 到 插件解压缩目录,里面有setup.py的文件: 2.定位到当前目录: 3.执行:python setup.py install; 4.结束安装. ...

  6. Python查询数据库时候遇到的乱码问题

    今天在看Python连接数据库的内容,然后遇到了最常遇到的字符乱码的状况,这真的很烦人,由于我用的是3.6的版本,,默认的是utf-8,如果是3以下的版本,请在文件开头加一句代码 #encoding= ...

  7. 剑指offer练习

    1.题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.  public c ...

  8. IOS实例方法和类方法的区别

    类方法和实例方法   实例方法是— 类开头是+ 实例方法是用实例对象访问,类方法的对象是类而不是实例,通常创建对象或者工具类. 在实例方法里,根据继承原理发送消息给self和super其实都是发送给s ...

  9. Go基础---->go的基础学习(二)

    这里记录的是go中函数的一些基础知识.道听途说终是浅,身临其境方知深. go的基础知识 一.go中函数的基础使用 package main import ( "fmt" " ...

  10. Excel 2010 对号叉号怎么打出来

    按小键盘数字键:Alt+41420  对号 按小键盘数字键:Alt+41642  叉号 http://jingyan.baidu.com/article/fdbd4277c228cdb89e3f482 ...