scala当中的文件操作、网络请求和隐式转换

  • 文件操作和网络请求
    • 读取文件当中每一行的数据
    • 读取词法单元和数字
    • 读取网络资源、文件写入、控制台操作
      • 读取网络资源
      • 文件写入操作
      • 控制台交互操作
      • scala当中的序列化
      • scala当中的正则表达式
  • 隐式转换和隐式参数
    • 隐式转换
    • 隐式转换方法作用域与导入
    • 隐式转换和隐式参数案例
      • 隐式转换案例一(将我们的Double类型的数据自动转换成Int类型)
      • 隐式转换案例二(让File类具备RichFile类中的read方法)
      • 隐式转换案例三(超人变身)
      • 隐式转换案例四(一个类隐式转换成具有相同方法的多个类)
      • 隐式参数案例五(员工领取薪水)

文件操作和网络请求

读取文件当中每一行的数据

def main(args: Array[String]): Unit = {//注意文件的编码格式,如果编码格式不对,那么读取报错val file: BufferedSource = Source.fromFile("F:\\scala与spark课件资料教案\\3、scala第三天\\files\\file.txt","GBK");val lines: Iterator[String] = file.getLines()for(line <- lines){println(line)}//注意关闭文件file.close()
}

如果要将文件内容转数组,直接调用toArray即可

读取词法单元和数字

如果想将以某个字符或某个正则表达式分开的字符成组读取,可以这么做:

def main(args: Array[String]): Unit = {val file: BufferedSource = Source.fromFile("F:\\scala与spark课件资料教案\\3、scala第三天\\files\\file2.txt","GBK");val split: Array[String] = file.mkString.split(" ")println(split.mkString("\t"))file.close()
}

读取网络资源、文件写入、控制台操作

读取网络资源


def main(args: Array[String]): Unit = {val source: BufferedSource = Source.fromURL("http://www.baidu.com")val string: String = source.mkStringprintln(string)source.close()
}

文件写入操作

def main(args: Array[String]): Unit = {val writer = new PrintWriter("F:\\scala与spark课件资料教案\\3、scala第三天\\files\\printWriter.txt")for(i <- 1 to 100){writer.println(i)writer.flush()}writer.close()
}

控制台交互操作

def main(args: Array[String]): Unit = {//控制台交互--老APIprint("请输入内容:")val consoleLine1 = Console.readLine()println("刚才输入的内容是:" + consoleLine1)//控制台交互--新APIprint("请输入内容(新API):")val consoleLine2 = StdIn.readLine()println("刚才输入的内容是:" + consoleLine2)
}

scala当中的序列化

@SerialVersionUID(1L)
class Person extends Serializable{override def toString = name + "," + ageval name = "Nick"val age = 20}object PersonMain extends App{override def main(args: Array[String]): Unit = {import java.io.{FileOutputStream, FileInputStream, ObjectOutputStream, ObjectInputStream}val nick = new Personval out = new ObjectOutputStream(new FileOutputStream("Nick.obj"))out.writeObject(nick)out.close()val in = new ObjectInputStream(new FileInputStream("Nick.obj"))val saveNick = in.readObject()in.close()println(saveNick)}
}

scala当中的正则表达式

我们可以通过正则表达式匹配一个句子中所有符合匹配的内容,并输出:

def main(args: Array[String]): Unit = {import scala.util.matching.Regexval pattern1 = new Regex("(S|s)cala")val pattern2 = "(S|s)cala".rval str = "Scala is scalable and cool"println((pattern2 findAllIn str).mkString(","))}

隐式转换和隐式参数

隐式转换

Scala提供的隐式转换和隐式参数功能,是非常有特色的功能。是Java等编程语言所没有的功能。它可以允许你手动指定,将某种类型的对象转换成其他类型的对象或者是给一个类增加方法。通过这些功能,可以实现非常强大、特殊的功能。
Scala的隐式转换,其实最核心的就是定义隐式转换方法,即implicit conversion function。定义的隐式转换方法,只要在编写的程序内引入,就会被Scala自动使用。Scala会根据隐式转换方法的签名,在程序中使用到隐式转换方法接收的参数类型定义的对象时,会自动将其传入隐式转换方法,转换为另外一种类型的对象并返回。这就是“隐式转换”。其中所有的隐式值和隐式方法必须放到object中。
然而使用Scala的隐式转换是有一定的限制的,总结如下:

  • implicit关键字只能用来修饰方法、变量(参数)。
  • 隐式转换的方法在当前范围内才有效。如果隐式转换不在当前范围内定义(比如定义在另一个类中或包含在某个对象中),那么必须通过import语句将其导。
    隐式参数
    所谓的隐式参数,指的是在函数或者方法中,定义一个用implicit修饰的参数,此时Scala会尝试找到一个指定类型的,用implicit修饰的参数,即隐式值,并注入参数。
    Scala会在两个范围内查找:
  • 当前作用域内可见的val或var定义的隐式变量;
  • 一种是隐式参数类型的伴生对象内的隐式值;

隐式转换方法作用域与导入

(1)Scala默认会使用两种隐式转换,一种是源类型或者目标类型的伴生对象内的隐式转换方法;一种是当前程序作用域内的可以用唯一标识符表示的隐式转换方法。
(2)如果隐式转换方法不在上述两种情况下的话,那么就必须手动使用import语法引入某个包下的隐式转换方法,比如import test._。通常建议,仅仅在需要进行隐式转换的地方,用import导入隐式转换方法,这样可以缩小隐式转换方法的作用域,避免不需要的隐式转换。
隐式转换的时机
(1)当对象调用类中不存在的方法或成员时,编译器会自动将对象进行隐式转换
(2)当方法中的参数的类型与目标类型不一致时

隐式转换和隐式参数案例

隐式转换案例一(将我们的Double类型的数据自动转换成Int类型)

object Chapter14 {implicit def ConvertDoubleToInt(first:Double):Int= first.toInt
}object Convert{//导入隐式转换的方法import Chapter14._def main(args: Array[String]): Unit = {val first:Int = 3.5}
}

例如我们也可以定义猫和狗,并且让狗学会抓老鼠的技能

object CatAndDog {implicit  def dogCatchMouse(dog:Dog) = new Cat()def main(args: Array[String]): Unit = {val dog = new Dogdog.catMouse("大黄狗")}
}
class Cat{def catMouse(name:String): Unit ={println(name+"catch a mouse")}
}
class Dog{def wangwangwang(name:String) ={println(name+"看门汪汪汪")}
}

隐式转换案例二(让File类具备RichFile类中的read方法)


import java.io.File
import scala.io.Source
object MyPredef{//定义隐式转换方法implicit def file2RichFile(file: File)=new RichFile(file)
}
class RichFile(val f:File) {def read()=Source.fromFile(f,"GBK").mkString
}
object RichFile{def main(args: Array[String]) {val f=new File("F:\\scala与spark课件资料教案\\3、scala第三天\\files\\file.txt")//使用import导入隐式转换方法import MyPredef._//通过隐式转换,让File类具备了RichFile类中的方法val content=f.read()println(content)}
}

隐式转换案例三(超人变身)

class Man(val name:String)
class SuperMan(val name: String) {def heat=print("超人打怪兽")
}
object SuperMan{//隐式转换方法implicit def man2SuperMan(man:Man)=new SuperMan(man.name)def main(args: Array[String]) {val hero=new Man("hero")//Man具备了SuperMan的方法hero.heat}
}

隐式转换案例四(一个类隐式转换成具有相同方法的多个类)

class A(c:C) {def readBook(): Unit ={println("A说:好书好书...")}
}
class B(c:C){def readBook(): Unit ={println("B说:看不懂...")}def writeBook(): Unit ={println("B说:不会写...")}
}
class C
object AB{//创建一个类的2个类的隐式转换implicit def C2A(c:C)=new A(c)implicit def C2B(c:C)=new B(c)
}
object B{def main(args: Array[String]) {//导包//1. import AB._ 会将AB类下的所有隐式转换导进来//2. import AB._C2A 只导入C类到A类的的隐式转换方法//3. import AB._C2B 只导入C类到B类的的隐式转换方法import AB._val c=new C//由于A类与B类中都有readBook(),只能导入其中一个,否则调用共同方法时代码报错//c.readBook()//C类可以执行B类中的writeBook()c.writeBook()}
}

隐式参数案例五(员工领取薪水)

object Company{//在object中定义隐式值    注意:同一类型的隐式值只允许出现一次,否则会报错implicit  val aaa="zhangsan"implicit  val bbb=10000.00
}
class Boss {//注意参数匹配的类型   它需要的是String类型的隐式值def callName()(implicit name:String):String={name+" is coming !"}//定义一个用implicit修饰的参数//注意参数匹配的类型    它需要的是Double类型的隐式值def getMoney()(implicit money:Double):String={" 当月薪水:"+money}
}
object Boss extends App{//使用import导入定义好的隐式值,注意:必须先加载否则会报错import Company._val boss =new Bossprintln(boss.callName()+boss.getMoney())}

scala当中的文件操作、网络请求和隐式转换相关推荐

  1. scala函数式变程,curry,读取文件,字符串插值,隐式转换,模式匹配

    文章目录 scala函数式变程 scala读取文件 字符串插值 scala隐式转换 模式匹配,偏函数,try catch scala函数式变程 object AdFunctionApp {def ma ...

  2. Scala入门到精通——第十九节 隐式转换与隐式参数(二)

    本节主要内容 隐式参数中的隐式转换 函数中隐式参数使用概要 隐式转换问题梳理 1. 隐式参数中的隐式转换 前一讲中,我们提到函数中如果存在隐式参数,在使用该函数的时候如果不给定对应的参数,则编译器会自 ...

  3. scala学习之旅(十三):隐式转换和隐式参数

    文章地址:http://www.haha174.top/admin/article/list 1.引言 scala 提供的隐式转换和隐式参数功能,是非常有特色的功能.是java 等编程语言所没有的功能 ...

  4. 【Scala】Scala中的模式匹配、类型参数与隐式转换

    1.模式匹配 (1)概述 模式匹配是Scala中非常有特色,非常强大的一种功能.模式匹配,其实类似于Java中的swich case语法,即对一个值进行条件判断,然后针对不同的条件,进行不同的处理.但 ...

  5. 大数据Saprk----Spark基础-scala的隐式转换

    first Codec **public class Friend {public static void main(String[] args){System.out.println("B ...

  6. Scala入门到精通——第十八节 隐式转换与隐式参数(一)

    本节主要内容 隐式转换简介 隐式转换函数 隐式转换规则 隐式参数 1. 隐式转换简介 在Scala语言当中,隐式转换是一项强大的程序语言功能,它不仅能够简化程序设计,也能够使程序具有很强的灵活性.要想 ...

  7. scala 环境搭建 变量 值 数据类型 元组 表达式块 语句 函数 柯里化 集合 面向对象 隐式转换

    scala (scalable的简写) scala是一个比较冷门的语言,不太被人们所知道 为什么这么冷门的语言现在被我们使用 很多的大数据的项目的源码是是用scala语言编写的. 因为大数据技术不断被 ...

  8. 20,sql 测试 : 1.4g 文件的 sql 运行测试,表关联,日期转换,字符编码,乱码解决,程序的 shell 执行,字符串转数字,三个隐式转换,用列分区,输出,sum over

    一 ,基础操作 : 1 ,表关联 : select stock.area,goods.smallLei,goods.typeColorId,weekofyear(to_date(stock.sellD ...

  9. 2021年大数据常用语言Scala(三十八):scala高级用法 隐式转换和隐式参数

    目录 隐式转换和隐式参数 隐式转换 自动导入隐式转换方法 隐式转换的时机 隐式参数 隐式转换和隐式参数 隐式转换和隐式参数是scala非常有特色的功能,也是Java等其他编程语言没有的功能.我们可以很 ...

最新文章

  1. 面对疫情,飞书线上办公室,让我们换一种方式重聚!
  2. Windows下安装Zabbix agent
  3. rhce linux下如何配置lvs高可用集群
  4. 如何学好Java?你应该躲开这几个坑
  5. python的river安装
  6. Kerberos 下运行spark 报错 Requested user hdfs is not whitelisted and has id 995,which is below the minimu
  7. 理解Docker(1):Docker 安装和基础用法
  8. 对账不平问题专题讲解内容
  9. Altium Designer_PCB板装配图的PDF文件输出
  10. XAMPP汉化教程指南
  11. 信息学奥赛一本通(C++版)在线评测系统 1887:【15NOIP提高组】神奇的幻方
  12. Email应用,SMTP协议,POP协议
  13. iOS SDK开发二三事
  14. 大O、小o、大Ω、小ω、大Θ符号在算法中是什么意思?
  15. 【Netty官方文档翻译】引用计数对象(reference counted objects)
  16. [含lw+源码等]javaweb银行柜员业务绩效考核系统
  17. XDOJ 233/237-字符串复制
  18. html表单边框怎么加颜色?html form标签的边框颜色实例
  19. Android开发资料
  20. CFA一级学习笔记--权益(一)--市场组织与架构

热门文章

  1. 如何搭建OpenOCD环境基于Window10+Cygwin?
  2. 2020.7.18 T3Ocd(jz暑假训练day4)
  3. adb server is out of date 最新解决方案
  4. 遇到视频聊天软件 v2.2.35
  5. 以太网交换机MAC地址表格式 IVL和SVL
  6. 前端开发工程师必备网站
  7. Python 小白学习之:linux 基础和 python 入门
  8. TCP拥塞控制算法-从BIC到CUBIC
  9. 「Adobe国际认证」Adobe Photoshop,如何裁剪并拉直照片?
  10. terminate called after throwing an instance of ‘YAML::TypedBadConversion<int>‘ what(): bad conver