Scala中语法糖的使用|推荐
Posted 无生活不技术
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala中语法糖的使用|推荐相关的知识,希望对你有一定的参考价值。
在Scala中,通常在一个类的伴生对象中定义apply方法,在生成这个类的对象时,就省去了new关键字。而样例类case class非常特殊,Scala会自动为其创建一个伴生对象:一个包含了apply 和 unapply方法的单例对象。apply 方法用来创建样例类的实例,而unapply 需要被伴生对象实现,以使其成为提取器。
本篇中就围绕使用Scala语言日常数据预处理过程当中,解析某种日志文件,来讲述apply的使用结合利用case class封装信息来处理日志。这里用一个日志处理Demo来演示这个过程:
首先:日志文件logFile.txt中有8条日志,一条日志中有两条记录,解析后有16条记录。
举例:
did=did-20170101;App={
com.nemo.video,
{
1=2017-08-18 21: 01: 15,
2=2017-08-19 00: 50: 39,
3=2
}
com.nemo.movie,
{
1=2017-08-18 21: 01: 18,
2=2017-08-19 00: 50: 39,
3=3
}
}
然后:实现LogInfo object类,定义apply方法,返回Iterable对象,
接下来,就可以自定义想要的操作:
如存储,简单打印等等。
本示例为简单演示,所以选择简单打印出来。
其中getInfo方法如下:
def getInfo(log: String): Iterable[LogInfo] = {
val records = log.split(';').map(x => {
val i = x.indexOf('=')
(x.substring(0, i), x.substring(i + 1))
}).toMap
val apps = records("App")
if (apps == "{}") {
Nil
} else {
parseInner(apps).map(x => {
LogInfo(records("did"), x._1, parseInfo(x._2))
})
}
}
parseInner方法如下:
def parseInner(apps: String): Iterable[(String, String)] = {
if (apps == "{}") {
Nil
} else {
apps.substring(1).split('}').map(x => {
val i = x.indexOf(',')
(x.substring(0, i), x.substring(i + 1) + "}")
})
}
}
parseInfo方法如下:
def parseInfo(info: String): Seq[String] = {
if (info != "{}") {
info.substring(1, info.length - 1).split(',').map(_.split("=", -1)(1)).toSeq
} else {
Seq[String]()
}
}
最后:简单调用,产生16条记录如下:
总结:在海量的日志处理过程当,使用Scala这种处理方式,还是比较高效和快捷的,所以推荐尝试使用。
以上是关于Scala中语法糖的使用|推荐的主要内容,如果未能解决你的问题,请参考以下文章