前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Scala 强大的精简语法(示例)

Scala 强大的精简语法(示例)

原创
作者头像
田祥
修改2017-11-13 15:54:11
1.8K0
修改2017-11-13 15:54:11
举报
文章被收录于专栏:田祥的专栏田祥的专栏

Scala 是面向对象与函数编程语言,最终编译成 java 字节码,运行在 jvm 上。如果要比较,最多的是和 java 对比,Scala 相对而言补全了 java 的许多弱点。例如:java 里接口与继承,在 Scala 里的是特质(trait),弥补 java 中接口的尴尬之处,特质里的方法可实现也可不实现。

在数据集操作方面,感觉和其他所有语言相比具有压倒性的优势(个人观点),悄悄的毫无征兆的实现了很多方法。例如:implict 实现的隐式转换,替换原有函数功能,如+,-等操作符(+,-等操作符在 Scala 都是函数,当然自己就可以改变这些函数并运用下去)。

同时还有在并发编程方面也有不错的竞争手段,Scala 将并发结果变得更加可控,同时模式匹配、提取器这些数据集操作都给操作带来了很大的方便,笔者是 Scala 新手,这只是一些粗糙的理解(如发现错误欢迎留言,会立马更正,因为技术所以不能马虎)。

本文使用了 Scala future、promise、数据集、implict、jsoup 的一些相关操作,从而特意选做了一个功能主题:提取淘宝目录分类名,流程为:获取 tb 目录 id->取得 id 下所有的子分类->写入数据库。不多 bb,看代码:

代码语言:txt
复制
//==================================================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 为最后一级目录名

[1497515854613_9165_1497515881883.png]
[1497515854613_9165_1497515881883.png]

贴上sbt libraryDependencies内容

代码语言:txt
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档