Scala入门之提取器

    xiaoxiao2025-01-25  7

    提取器

    这知识感觉多数跟case class配合使用,但是在与case class配合使用时就算不知道后面的工作机制也没什么关系,会用就行。 其实有必要的话可以自己写提取器,而什么时候用提取器,怎么提高数据传输效率才是难点 :( 直接上代码,加上个人理解 package com.dt.scala.moguyun /** * 提取器 * unapply * 看两点: * 1 类有没有unapply方法 * 2 unapply方法里传的参数是不是右边的 * 即可调用 * Created by hlf on 2016/8/11. */ case class Person1(name: String, age: Int) { val content = name } case class Person2(name: String, age: Int, salary: Int) { } /** * 新建类,里面有apply和unapply方法 */ class DTCoder(val name: String, val salary: Int) object DTCoder { def apply(name: String, salary: Int) = { println("DTCoder apply methode invoked !!!") new DTCoder(name, salary) } def unapply(information: DTCoder) = { Some((information.name, information.salary)) /* //少见,基本都是传入一个对象 def unapply(information:String)= { Some((information.substring(0,information.indexOf(" ")),information.substring(0,information.indexOf(" ")+1))) } */ } } object HelloExtractor { def main(args: Array[String]): Unit = { //case class会自动生成apply和unapply方法,所以不用new, //Person1("spark", 6)与下面的是一样的 val person = Person1.apply("spark", 6) //将person用unapply提取出name,age赋值给另一个case class //赋值给同类型的case class val Person1(name1, age1) = person //赋值给不同类型的case class // val Person2(name2, age2) = person//运行时报错,说要求是Person1才行 println("person1" + name1 + " : " + age1) // println("person2" +name2 + " : " + age2) person match { case Person1(name, age) => println("wow " + name + " : " + age) } val dtcoder = DTCoder("hadoop", 200) println(dtcoder.name + ": " + dtcoder.salary) //像这种用提取器提取出来再赋值给同一个类型对象有意思吗?还不如用上面的dtcoder.name点出来呢 -_-! val DTCoder(dtname1, dtsalary1) = dtcoder println("dtname1 " + dtname1 + " : " + dtsalary1) /* val DTCoder(dtname,dtsalary) = "spark 100" println("dtname "+dtname+ " : " +dtsalary) */ //从字符串通过提取器构建出一个类,在网络传输时能大大提高性能,这是一个思考方向。 } } 结果 person1spark : 6 wow spark : 6 DTCoder apply methode invoked !!! hadoop: 200 dtname1 hadoop : 200

    以上内容来自[DT大数据梦工厂]首席专家Spark专家王家林老师的课程分享。感谢王老师的分享,更多精彩内容请扫描关注[DT大数据梦工厂]微信公众号DT_Spark

    转载请注明原文地址: https://ju.6miu.com/read-1295772.html
    最新回复(0)