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