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

       }

}

Scala中语法糖的使用|推荐


然后:实现LogInfo object类,定义apply方法,返回Iterable对象,

接下来,就可以自定义想要的操作:

如存储,简单打印等等。

本示例为简单演示,所以选择简单打印出来。

Scala中语法糖的使用|推荐

其中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]()
  }
}

Scala中语法糖的使用|推荐

Scala中语法糖的使用|推荐

最后:简单调用,产生16条记录如下:

总结:在海量的日志处理过程当,使用Scala这种处理方式,还是比较高效和快捷的,所以推荐尝试使用。



以上是关于Scala中语法糖的使用|推荐的主要内容,如果未能解决你的问题,请参考以下文章

C#中切片语法糖的使用

有和没有语法糖的 Python 装饰器之间的区别?

python 此文件用于显示语言中语法糖的中文文章。

scala基本语法和单词统计

2021年大数据常用语言Scala:基础语法学习 循环

Scala基础语法