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

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

田祥的专栏

1 篇文章1 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏积累沉淀

【译】Java 8的新特性—终极版

声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中发现并发编程网已经有同学翻译过了:...

23210
来自专栏CDA数据分析师

Python3 大作战之 encode 与 decode 讲解

原文链接http://blog.csdn.net/qq_29053519/article/details/79170519 大家好,很久没更新了,也是年底了最近...

2795
来自专栏向治洪

Java 8新特性

编者注:Java 8已经公布有一段时间了,种种迹象表明Java 8是一个有重大改变的发行版。 在Java Code Geeks上已经有大量的关于Java 8 的...

3376
来自专栏HansBug's Lab

1901: Zju2112 Dynamic Rankings

1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MB Submit: ...

2736
来自专栏小樱的经验随笔

【Java学习笔记之二十八】深入了解Java8新特性

前言: Java 8 已经发布很久了,很多报道表明java 8 是一次重大的版本升级。在Java Code Geeks上已经有很多介绍Java 8新特性的文章,...

3477
来自专栏图形学与OpenGL

WebGL三角形平移变换(矩阵方式)

2041
来自专栏coder修行路

Go 处理yaml类型的配置文件

先说一下,这里用到了很多关于反射类型的功能,可能刚开始看代码,如果对反射不熟悉的可能会不是非常清晰,但是同时也是为了更好的理解golang中的反射,同时如果后面...

1440
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-20(01)总结,递归,IO流

1:递归(理解) (1)方法定义中调用方法本身的现象 举例:老和尚给小和尚讲故事,我们学编程 (2)递归的注意事项; A:要有出口,否则就是死递归 B...

3509
来自专栏desperate633

LeetCode 9. Palindrome Number分析代码

最常规的思路是直接将数反转再对比,但实际上,我们只需要反转后半部分跟前半部分对比就可以了。两种情况,一是位数为偶数,直接对比,位数为奇数,大数除以10对比。

822
来自专栏用户画像

7.7.1外部排序

内部排序都是在内存中进行的,而在实际应用中,经常需要对大文件进行排序,因为文件中的记录很多、信号量庞大,无法将整个文件拷贝进内存中进行排序。因此,需要将待排序的...

691

扫码关注云+社区