Scala For Java的一些参考
变量 |
String yourPast = "Good Java Programmer"; |
val yourPast : String = "Good Java Programmer" val yourPast = "Good Java Programmer" var yourFuture = "Good Java Programmer" 自动类型推断;可变、不可变变量 class Money(amount:Int) amount不是成员变量 class Money(val amount:Int) val notMuch = new Money(2) notMuch.amount class Money(var amount:Int) val notMuch = new Money(2) notMuch.amount=3 |
case classes |
public class Money { private Integer amount; private String currency; public Money(Integer amount, String currency) { this.amount = amount; this.currency = currency; } public Integer getAmount() { return amount; } public void setAmount(Integer amount) { this.amount = amount; } public String getCurrency() { return currency; } public void setCurrency(String currency) { this.currency = currency; } @Override public int hashCode() { int hash = 5; hash = 29 * hash + (this.amount != null ? this.amount. hashCode() : 0); hash = 29 * hash + (this.currency != null ? this.currency. hashCode() : 0); return hash; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Money other = (Money) obj; return true; } @Override public String toString() { return "Money{" + "amount=" + amount + ", currency=" + currency + '}'; } public Money add(Money other) { return new Money(this.amount + other.amount, this.currency); } } |
case class Money(amount:Int=1, currency:String="USD") two immutable fields the fields declared in Scala classes are public case class Money(private val amount: Int, private val currency: String) to make them private instead, or used var instead of val to make the fields mutable. val defaultAmount = Money() val fifteenDollars = Money(15,"USD") val fifteenDollars = Money(15) val someEuros = Money(currency="EUR") case class Money(val amount:Int=1, val currency:String="USD"){ def +(other: Money) : Money = Money(amount + other.amount) } Money(12) + Money(34) |
collections |
Scala collections are, by default, immutable val numbers = List(1,2,3,4,5,6) val reversedList = numbers.reverse val onlyAFew = numbers drop 2 take 3 cons operator val numbers = 1 :: 2 :: 3 :: 4 :: 5 :: 6 :: Nil val simpleList = Nil.::(6) val twoElementsList = List(6).::(5) 列表串接 val concatenatedList = simpleList ::: twoElementsList val things = List(0,1,true) AnyVal val things = List(0,1,true,"false") Any 复杂对象列表 val amounts = List(Money(10,"USD"),Money(2,"EUR"),Money(20,"GBP"), Money(75,"EUR"),Money(100,"USD"),Money(50,"USD")) Filter val euros = amounts.filter(money => money.currency=="EUR") val euros = amounts.filter(x => x.currency=="EUR") val euros = amounts.filter(_.currency=="EUR") partition val allAmounts = amounts.partition(amt => amt.currency=="EUR") Tuples val euros = allAmounts._1 val everythingButEuros= allAmounts._2 val (euros,everythingButEuros) = amounts.partition(amt => amt.currency=="EUR") |
|
Map |
Map amounts = new HashMap<String,Integer>(); amounts.put("USD", 10); amounts.put("EUR", 2); |
val wallet = Map( "USD" -> 10, "EUR" -> 2 ) val someEuros = wallet("EUR") Option类型 val mayBeSomePounds = wallet.get("GBP") val updatedWallet = wallet + ("GBP" -> 20) 新的不可变 val tenDollars = "USD"-> 10 Tuple |
def increment = (x:Int) => x + 1 List(1,2,3,4).map(increment) List(1,2,3,4) map increment |
||
String Interpolation |
val many = 10000.2345 val amount = s"$many euros" 格式化宽度 val amount = f"$many%12.2f euros" val amount = s"${many*2} euros" val printedAmounts = amounts map(m=> s"${m.amount} ${m.currency}") |
|
groupBy |
groupBy method that transforms a collection into a Map collection: val sortedAmounts = amounts groupBy(_.currency) |
|
Scala UnitTest |
POM.xml maven依赖文件 • Dependency for the core scala-library: <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>2.10.0</version> </dependency> • Dependency for scalatest (a framework for testing in Scala that supports JUnit and other styles; we will cover it in detail in Chapter 4, Testing Tools): <dependency> <groupId>org.scalatest</groupId> <artifactId>scalatest_2.10</artifactId> <version>2.0/version> <scope>test</scope> </dependency> • Dependency for JUnit to use Java Assert statements in our test case: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> scala-maven-plugin <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <executions> <execution> <id>scala-compile-first</id> <phase>process-resources</phase> <goals> <goal>add-source</goal> <goal>compile</goal> </goals> </execution> <execution> <id>scala-test-compile</id> <phase>process-test-resources</phase> <goals> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> 单元测试代码 import org.junit._ import Assert._ class CustomerScalaTest { @Before def setUp: Unit = { } @After def tearDown: Unit = { } @Test def testGetCustomerId = { System.out.println("getCustomerId") val instance = new Customer() val expResult: Integer = null val result: Integer = instance.getCustomerId() assertEquals(expResult, result) } } |
|
Java/Scala Collection转换 |
./activator console import java.util.Arrays val javaList = Arrays.asList(1,2,3,4) import scala.collection.JavaConverters._ val scalaList = javaList.asScala val javaListAgain = scalaList.asJava assert( javaList eq javaListAgain) |
|
JavaBean-style properties |
class Company(var name:String) val sun = new Company("Sun Microsystems") sun.name sun.name_=("Oracle") import scala.beans.BeanProperty class Company(@BeanProperty var name:String) val sun = new Company("Sun Microsystems") sun.getName() sun.setName("Oracle") |
|
OO |
class Customer ( var customerId: Int, var zip: String) { def this( zip: String) = this(0,zip) def getCustomerId() = customerId def setCustomerId(cust: Int): Unit = { customerId = cust } } val customer = new Customer("123 45") |
|
traits |
interface VIPCustomer { Integer discounts(); } class Customer(val name:String, val discountCode:String="N" ){ def discounts() : List[Int] = List(5) override def toString() = "Applied discounts: " + discounts.mkString(" ","%, ","% ") } trait VIPCustomer extends Customer { override def discounts = super.discounts ::: List(10) } trait GoldCustomer extends Customer { override def discounts = if (discountCode.equals("H")) super.discounts ::: List(20) else super.discounts ::: List(15) } object Main { def main(args: Array[String]) { val myDiscounts = new Customer("Thomas","H") with VIPCustomer with GoldCustomer println(myDiscounts) } } scala> Main.main(Array.empty) Applied discounts: 5%, 10%, 20% Note that the order in which traits are stacked is important. They are calling each other from right to left. GoldCustomer is, therefore, the first one to be called. |
|
Static companion objects |
object Main { def main(args: Array[String]) { println("Hello Scala World !") } } object Customer { def apply()= new Customer("default name") } class Customer(name:String) { … } |
|
exceptions |
public class ConversionSample { static Integer parse(String numberAsString) { Integer number = null; try { number = Integer.parseInt(numberAsString); } catch (NumberFormatExceptionnfe) { System.err.println("Wrong format for "+numberAsString); } catch (Exception ex) { System.err.println("An unknown Error has occurred"); } System.out.println("Parsed Number: "+number); return number; } |
def parse(numberAsString: String) = try { Integer.parseInt(numberAsString) } catch { case nfe: NumberFormatException => println("Wrong format for number "+numberAsString) case e: Exception => println("Error when parsing number"+ numberAsString) } 返回值 case nfe: NumberFormatException => println("Wrong format for number "+numberAsString); -1 case _: Throwable => println("Error when parsing number "+numberAsString) -1 scala.util.Left or scala.util.Right type case class Failure(val reason: String) def parse(numberAsString: String) : Either[Failure,Int] = try { val result = Integer.parseInt(numberAsString) Right(result) } catch { case _ : Throwable => Left(Failure("Error when parsing number")) } |
String customerLevel = null; if(amountBought > 3000) { customerLevel = "Gold"; } else { customerLevel = "Silver"; } |
val amountBought = 5000 val customerLevel = if (amountBought> 3000) "Gold" else "Silver" |
|
Scala的代码风格 IDE |
http://docs.scala-lang.org/style/ Eclipse-based (including all the different versions of Eclipse, Typesafe's own bundled version known as Scala IDE as well as more commercial IDEs such as SpringSourceSTS), IntelliJ IDEA, and NetBeans. |
|
SBT |
Simple Build Tool (SBT) http://www.scala-sbt.org/ http://www.scala-sbt.org/0.13/tutorial/Hello.html 例子 http://www.scala-sbt.org/0.13/tutorial/Directories.html 目录结构,Build.sbt是sbt的定义文件 |
|
SBT plugins |
https://github.com/typesafehub/sbteclipse 基于sbt生成eclipse使用的工程文件 https://github.com/mpeltonen/sbt-idea 基于sbt生成IntelliJ使用的工程文件 https://github.com/dcaoyuan/nbscala/wiki/SbtIntegrationInNetBeans 基于sbt生成Netbeans使用的工程文件 plugins.sbt中修改以生成 xsbt-web-plugin (available at https://github.com/JamesEarlDouglas/xsbt-web-plugin ), a useful plugin to create traditional web apps that runs on a servlet container (such as Jetty). v Plugins.sbt: addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "0.4.2") Build.sbt: name := "SampleProject" organization := "com.samples" version := "1.0" scalaVersion := "2.10.3" seq(webSettings :_*) libraryDependencies += "org.mortbay.jetty" % "jetty" % "6.1.22" % "container" libraryDependencies += "javax.servlet" % "servlet-api" % "2.5" % "provided" v sbt eclipse生成了eclipse工程 v 启动web工程 > sbt > container:start v War包生成 > package |
|
sbt-assembly |
https://github.com/sbt/sbt-assembly v Plugins.sbt addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2") v assembly.sbt import AssemblyKeys._ // put this at the top of the file assemblySettings // your assembly settings here |
|
Scalariform |
plugins.sbt addSbtPlugin("com.typesafe.sbt" % "sbt-scalariform" % "1.2.0") SBT中运行compile or test:compile时,即按照scala风格格式化代码 |
|
Scala Worksheets |
Eclipse中建立的菜单 每次保存时,可以看到执行的结果 |
|
Java基础库上scala的封装例子 |
http://dispatch.databinder.net/Dispatch.html HttpClient上的封装 build.sbt添加libraryDependencies += "net.databinder.dispatch" %% "dispatch-core" % "0.11.0" import dispatch._, Defaults._ val request = url("http://freegeoip.net/xml/www.google.com") val result = Http( request OK as.String) val resultAsString = result() def printer = new scala.xml.PrettyPrinter(90, 2) for (xml <- citiesAsXML) println(printer.format(xml)) |
|
for comprehension or for expression |
for (sequence) yield expression In the preceding code, sequence can contain the following components: • Generators: They drive the iteration and are written in the following form: element <- collection • Filters: They control the iteration and are written in the following form: if expression • Definitions: They are local variable definitions and are written in the following form: variable = expression for { elem <- List(1,2,3,4,5) } yield "T" + elem for { word <- List("Hello","Scala") char <- word } yield char.isLower for { word <- List("Hello","Scala") char <- word if char.isUpper } yield char or { word <- List("Hello","Scala") char <- word lowerChar = char.toLower } yield lowerChar |
|
测试 |
ScalaTest ( www.scalatest.org ) and Specs2 ( etorreborre.github.io/specs2/ ). ScalaCheck framework ( www.scalacheck.org ) Typesafe Activator包含必要的插件,项目根下执行> activator eclipse即生成eclipse工程 import org.scalatest.FunSuite class Test01 extends FunSuite { test("Very Basic") { assert(1 == 1) } test("Another Very Basic") { assert("Hello World" == "Hello World") } } > activator > test-only scalatest.Test01 (or scalatest.Test01.scala) >~test-only scalatest.Test02 文件修改后自动运行单元测试【continuous mode】 The continuous mode works for the other SBT commands as well, such as ~run or ~test 作为Junit的单元测试方式运行 import org.junit.runner.RunWith import org.scalatest.junit.JUnitRunner import org.scalatest.FunSuite @RunWith(classOf[JUnitRunner]) class MyTestSuite extends FunSuite ... www.seleniumhq.org 功能测试 package scalatest import org.scalatest._ import org.scalatest.selenium.WebBrowser import org.openqa.selenium.htmlunit.HtmlUnitDriver import org.openqa.selenium.firefox.FirefoxDriver import org.openqa.selenium.WebDriver class Test08 extends FlatSpec with Matchers with WebBrowser { implicit val webDriver: WebDriver = new HtmlUnitDriver go to "http://www.amazon.com" click on "twotabsearchtextbox" textField("twotabsearchtextbox").value = "Scala" submit() pageTitle should be ("Amazon.com: Scala") pageSource should include("Scala Cookbook: Recipes") } www.scalamock.org |
|
Web框架 |
alternatives to create web applications range from lightweight frameworks such as Unfiltered, Spray, or Scalatra to full-featured solutions such as the Lift or the Play Frameworks. http://www.playframework.com/ http://www.playmodules.net |
|
Web Service |
Plugins.sbt addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" %"2.4.0") addSbtPlugin("org.scalaxb" % "sbt-scalaxb" % "1.1.2") resolvers += Resolver.sonatypeRepo("public") build.sbt import ScalaxbKeys._ name:="wssample" scalaVersion:="2.10.2" scalaxbSettings ibraryDependencies += "net.databinder.dispatch" %% "dispatch-core" %"0.11.0" libraryDependencies += "org.scalatest" %% "scalatest" % "2.0.M7" %"test" sourceGenerators in Compile <+= scalaxb in Compile packageName in scalaxb in Compile := "se.wssample" |
|
XML/JSON |
val books = <Library> <book title="Programming in Scala" quantity="15" price="30.00" /> <book title="Scala for Java Developers" quantity="10" price="25.50" /> </Library> import scala.xml._ val sameBooks = XML.loadString(""" <Library> <book title="Programming in Scala" quantity="15" price="30.00"/> <book title="Scala for Java Developers" quantity="10" price="25.50"/> </Library> """) val total = (for { book <- books \ "book" price = ( book \ "@price").text.toDouble quantity = ( book \ "@quantity").text.toInt } yield price * quantity).sum val books = <Library> { List("Programming in Scala,15,30.00","Scala for Java Developers,10,25.50") map { row => row split "," } map { b => <book title={b(0)} quantity={b(1)} price={b(2)} /> }} </Library> import scala.util.parsing.json._ val result = JSON.parseFull(""" { "Library": { "book": [ { "title": "Scala for Java Developers", "quantity": 10 }, { "title": "Programming Scala", "quantity": 20 } ]} } """) |
|
Futures and Promises |
Scala Improvement Process (SIP)SIP-14-Futures and Promises http://en.wikipedia.org/wiki/Futures_and_promises • async { <expression> } : In this construct, <expression> is the code to be executed asynchronously. • await { <expression returning a Future> } : This construct is included in an async block. It suspends the execution of the enclosing async block until the argument Future is completed. async future Actor |
|
Reactive Systems |
http://www.reactivemanifesto.org/ 反应式编程 |
|
Misc |
MongoDB database, we are going to discover how the Casbah Scala toolkit https://github.com/mongodb/casbah |
|
RPEL模式下拷贝部分代码运行 scala> :paste // Entering paste mode (ctrl-D to finish) |
||
Scala For Java的一些参考相关推荐
- 如何获取Kafka的消费者详情——从Scala到Java的切换
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- 使用Scala实现Java项目的单词计数:串行及Actor版本
其实我想找一门"具有Python的简洁写法和融合Java平台的优势, 同时又足够有挑战性和灵活性"的编程语言. Scala 就是一个不错的选择. Scala 有很多语言特性, 建议 ...
- scala和java像不像_关于Java和Scala同步的五件事你不知道
scala和java像不像 实际上,所有服务器应用程序都需要在多个线程之间进行某种同步. 大多数同步工作是在框架级别为我们完成的,例如通过我们的Web服务器,数据库客户端或消息传递框架. Java和S ...
- scala rest_使用路标的Scala和Java的Twitter REST API
scala rest 如果您已经阅读了此博客上的其他文章,您可能会知道我喜欢创建各种数据集的可视化. 我刚刚开始一个小项目,在这里我想可视化来自Twitter的一些数据. 为此,我想直接从Twitte ...
- scala使用java类_使用Java和Scala将Play Framework 2应用程序部署到Openshift
scala使用java类 几个星期, 马克·阿特伍德 ( Mark Atwood) , 豪尔赫·艾利斯 ( Jorge Aliss )和我塞巴斯蒂安 ·斯卡塔诺 ( SebastiánScarano) ...
- 使用路标的Scala和Java的Twitter REST API
如果您已阅读此博客上的其他文章,您可能会知道我喜欢创建各种数据集的可视化. 我刚刚开始一个小项目,在这里我想可视化来自Twitter的一些数据. 为此,我想直接从Twitter检索有关关注者的信息和个 ...
- scala与java的区别_Scala学习笔记及与Java不同之处总结
Scala与Java具有许多相似之处,但又有许多不同.这里主要从一个Java开发人员的角度,总结在使用Scala的过程中所面临的一些思维转变.这里只是总结了部分两种语言在开发过程中的不同,以后会陆续更 ...
- Scala与Java交互
2019独角兽企业重金招聘Python工程师标准>>> ###代码示例 假如我们想要根据某个特定国家(比如法国)的习惯来获取并格式化当前日期, 我们可以使用以下 Scala 和 Ja ...
- Scala调用Java静态成员及静态方法注意点——只能通过当前类名调用而不能借助子类调用父类静态成员/方法
只能通过当前类名NioUtil调用静态成员 package com.zxl.scalaimport cn.hutool.core.io.{FileUtil, IoUtil, NioUtil} impo ...
- 详解Scala与Java的互动
详解Scala与Java的互动
最新文章
- 采用DCO-OFDM的VLC系统
- phpnow升级php版本 php-5.2.14-Win32升级至5.3.5
- 十条有用的 Go 技术
- 语音识别软件_语音识别软件是什么_离线语音识别软件_企业服务汇
- 甲骨文每季安全更新再修补297个漏洞
- vue用阿里云oss上传图片使用分片上传只能上传100kb以内的解决办法 1
- 数值分析复习(七)——偏微分方程数值解法
- Python之基础详解(九):关于VisualMapOpts视觉映射配置项详解
- 解决word各级标题序号后面有长空格
- sqlplus命令连接oracle数据库,sqlplus命令行登录oracle数据库的N种方法盘点
- 知乎与百度知道竞品分析-用户五要素
- 小白专属:大数据总纲_大数据路线_高屋建瓴的体验大数据的世界
- Python requests HTTP验证登录实现流程
- Entity Framework学习笔记——EF简介(一篇文章告诉你什么是EF)
- 视频类网站的简单研究
- 个人Gmail跟MSN邮箱账号,怕忘记
- 【小算法】图的遍历之深度优先(DFS)
- [noip2014] 飞扬的小鸟
- C语言 - 跳舞配对问题
- linux 进入汉字目录,终端下拼音补全中文名称和路径
热门文章
- python调用sklearn库BP神经网络基于小样本进行痘痘预测尝试
- RpcOrtho failed: An unknown process erroroccurred.
- 【ArcGIS|3D分析】要素的立体显示
- FFmpeg开发(一)常用处理视频命令
- Request中Attribute 和 Parameter 的区别
- mysql 定时备份 空_如何在不停止Mysql服务的状况下,定时备份mysql数据库
- 计算机网络工程专业面试,网络工程专业大学生面试自我介绍范文
- golang-go mod版本等相关内容:
- Kettle JAVA代码表达式
- 直线检测原理matlab,Hough变换 直线检测原理及其Matlab实现