scala隐式转换的两个demo

       当某个类需要某个方法时,但是这个类本身并没有提供这个方法,我们可以通过一个小插件的方式-隐式转换,通过隐式转换我们可以像调用这个类本身已经存在方法一样来使用。

隐式转换需要:

          1.缺少方法的类;

          2. 包含隐式转换的增强类;

          3.包含方法的类;

示例如下:我们要实现判断数据发送者是否发送过数据给数据接收者?

如下是缺少方法的类:

class DataLog{
  @BeanProperty var source: = 0 // 数据发送者 1代表已发送 0否 
  @BeanProperty var dst: Int = 0  //  数据接收者
  @BeanProperty var sourceID:String=""//发送者ID
}

如下是包含隐式转换的增强类:

object DataUtil {
  implicit def enhance( data: DataLog) = new DataUtil(data)
}

如下是包含方法的类:

class DataUtil(val data: DataLog) {
  /**
   * 判断发送者是否发送过数据
   *
   * @return
   */
  def isSourceSend: Boolean = {
    data.source == 1 
  }
  
}

测试如下:DataLog本来没有isSourceSend 这个方法,通过隐式转换,可以像调用自己本身存在的方法一样来使用

object Test {
  def main(args: Array[String]): Unit = {
    val log = new DataLog
    import com.test.util.DataUtil._
    log.isSourceSend
  }
}

例二:spark的rdd方法没有toForEachPartitionsSaveEs 方法,通过隐式转换可以直接调取方法

// val finalResultReportRDD:RDD[(String, String)]=Nil

import com.test.utils.RDDImplicitUtils._
finalResultReportRDD.toForEachPartitionsSaveEs
object RDDImplicitUtils {
  private val dao = new ElasticSearchHighLevelDao[JSONObject]()

  implicit class RddUtil(rdd: RDD[(String, String)]) {
    def toForEachPartitionsSaveEs= {
      rdd.partitionBy(new InsertElasticSearchPartitioner(10)).foreachPartition(iterator => {
        try {
          //elasticSearch批量执行script脚本
        } catch {
          case ex: Exception => ex.printStackTrace()
        }
      })
    }
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值