Scala 是面向对象与函数编程语言,最终编译成 java 字节码,运行在 jvm 上。如果要比较,最多的是和 java 对比,Scala 相对而言补全了 java 的许多弱点。例如:java 里接口与继承,在 Scala 里的是特质(trait),弥补 java 中接口的尴尬之处,特质里的方法可实现也可不实现。
在数据集操作方面,感觉和其他所有语言相比具有压倒性的优势(个人观点),悄悄的毫无征兆的实现了很多方法。例如:implict 实现的隐式转换,替换原有函数功能,如+,-等操作符(+,-等操作符在 Scala 都是函数,当然自己就可以改变这些函数并运用下去)。
同时还有在并发编程方面也有不错的竞争手段,Scala 将并发结果变得更加可控,同时模式匹配、提取器这些数据集操作都给操作带来了很大的方便,笔者是 Scala 新手,这只是一些粗糙的理解(如发现错误欢迎留言,会立马更正,因为技术所以不能马虎)。
本文使用了 Scala future、promise、数据集、implict、jsoup 的一些相关操作,从而特意选做了一个功能主题:提取淘宝目录分类名,流程为:获取 tb 目录 id->取得 id 下所有的子分类->写入数据库。不多 bb,看代码:
//==================================================mainfunc=======================================================
import java.sql.DriverManager
import model.ConfigModel
import tool.{FileDescription, TaoBaoCategory}
import scala.collection.mutable
import scala.collection.mutable.ListBuffer
import scala.concurrent.{Await, Future}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.util.Try
import scala.xml.XML
import org.json4s._
import org.json4s.native.JsonMethods._
import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import scala.util.{Failure, Success}
def categoryGet(): Unit = {
var listId = mutable.Map[String, String]() //用来存目录名称与目录 id
Try(Jsoup.connect("https://www.taobao.com/").get()) match {
case Failure(e) => //case 模式匹配失败
println(e.getMessage)
case Success(doc) => //case 模式匹配成功
listId = parseDoc(doc)
}
System.setProperty("Scala.concurrent.context.maxThreads", "4") //设置并发线程数
val listBuffer = new ListBuffer[Future[(String,String)]]()
for ((k,v) <- listId) {
listBuffer.append(TaoBaoCategory.ReadCategory(k,v)) //所有的并发对象存入 listBuffer
}
val f = Future.sequence(listBuffer)
val result = Await.result(f,Duration.Inf) //阻塞主线程等待所有 Future 完成,result 将是每个 future 返回(String,String) 的列表
for ((name,jsondata) <- result) {
val jsonObj = parse(jsondata)
val jsonParse = parse(jsondata).values.asInstanceOf[Map[String,Any]]
for ((k1,v1) <- jsonParse) {
val v2 = v1.asInstanceOf[Map[String,Any]].get("value").get.asInstanceOf[Map[String,Any]].get("list").get.asInstanceOf[List[Map[String,Any]]] //获取 list,也就是最后一级目录
v2.foreach {
case m: Map[String,Any] => {
val nameitem = if (!m.get("name").isEmpty) m.get("name").get else Some("")
val link = if (!m.get("link").isEmpty) m.get("link").get else Some("")
// println(s"${name} : ${k1}: ${nameitem}: ${link}")
val str = s"insert into tmitemcatalog(categoryid,firstname,secondname,secondnameurl,status) value('${k1}','${name}','${nameitem}','${link}','1')"
println(str)
insertData(str)
}
}
}
}
}
//提取 Map(name->id),只需几行代码
def parseDoc(doc:Document): mutable.Map[String, String] = {
val map = scala.collection.mutable.Map[String,String]()
(doc.select("a[data-cid=\"1\"]").toArray().foreach(x => {val d = XML.loadString(x.toString);map += (d.text -> d.attribute("data-dataid").get.toString())}))
map //返回
}
//===========================================TaoBaoCategory============================================================
import scala.concurrent.{Future, Promise}
import scala.io.Source
object TaoBaoCategory {
//ConfigModel.taoBaoCagetoryUrlGet = "https://tce.alicdn.com/api/data.htm?ids=" 淘宝接口
def ReadCategory(name: String,id:String,url: String = ConfigModel.taoBaoCagetoryUrlGet): Future[(String,String)] = {
val p = Promise[(String,String)] //声明 Promise,使 future 操作更强,更敏捷
val fileContent = Source.fromURL(url + id,"utf-8").mkString
p.success((name,fileContent))
p.future
}
//隐式转换如:ReadCategory(1000),1000 被隐式转成 String 了
implicit def convertIntToString(arg: Int) = arg.toString
//隐式转换如:ReadCategory(true)
implicit def convertBoolToString(arg: Boolean) = if(arg) "true" else "false"
implicit def convertLongToString(arg: Long) = arg.toString
//隐式转换如:ReadCategory(3.1415)
implicit def convertFloatToString(arg: Float) = arg.toString
}
贴上接口数据图片,list 为最后一级目录名
贴上sbt libraryDependencies内容
libraryDependencies += "org.scala-lang.modules" %% "scala-xml" % "1.0.4"
libraryDependencies += "org.jsoup" % "jsoup" % "1.8.1"
libraryDependencies += "net.liftweb" %% "lift-json" % "2.6"
libraryDependencies += "org.json4s" % "json4s-native_2.10" % "3.2.4"
libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.4
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。