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") } |
|
|
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的一些参考的更多相关文章
- 使用Scala实现Java项目的单词计数:串行及Actor版本
其实我想找一门“具有Python的简洁写法和融合Java平台的优势, 同时又足够有挑战性和灵活性”的编程语言. Scala 就是一个不错的选择. Scala 有很多语言特性, 建议先掌握基础常用的: ...
- scala与java之间的那些事
scala与java之间的关系,我认为可以用一句话来开头:scala来源于java,但又高于java. scala的设计者Martin Odersky就是一个JAVA控,这位牛人设计了javac和编写 ...
- scala调用java的方法,返回了一个对象链表List<Student>,在scala中遍历该链表获取指定Student的名字name
假设Student类如下: class Student { private int no; private String name; public int getNo() { return no; } ...
- scala vs java 相同点和差异
本贴是我摘抄自国外网站,用作备忘,也作为分享! Similarities between Scala and Java Following are some of the major similari ...
- Spark:用Scala和Java实现WordCount
http://www.cnblogs.com/byrhuangqiang/p/4017725.html 为了在IDEA中编写scala,今天安装配置学习了IDEA集成开发环境.IDEA确实很优秀,学会 ...
- IDEA15使用maven编译scala和java
机器安装maven,在IDEA中配置maven的home 创建项目:new-maven–> scala-archetype-simple project structure–>创建src. ...
- scala 与 java 之间的关系
scala来源于java,但又高于java. scala的设计者Martin Odersky就是一个JAVA控,这位牛人设计了javac和编写了jdk中的通用代码.可以说java语言本身就是Marti ...
- 编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本]
编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本] 1. 开发环境 Jdk 1.7.0_72 Maven 3.2.1 Scala 2.10.6 Spark 1.6 ...
- Scala IDEA for Eclipse里用maven来创建scala和java项目代码环境(图文详解)
这篇博客 是在Scala IDEA for Eclipse里手动创建scala代码编写环境. Scala IDE for Eclipse的下载.安装和WordCount的初步使用(本地模式和集群模式) ...
随机推荐
- js分页页码算法
function get_hs_page(cur_page, total_page) { var result = ""; ; i <= total_page; i++) { ...
- 纯JS打造比QQ空间更强大的图片浏览器-支持拖拽、缩放、过滤、缩略图等
在线演示地址(打开网页后,点击商家图册): http://www.sport7.cn/cc/jiangnan/football5.html 先看一看效果图: 该图片浏览器实现的功能如下: 1. 鼠标滚 ...
- CSharpGL(37)创建和使用VBO的最佳方式
CSharpGL(37)创建和使用VBO的最佳方式 开始 近日在OpenGL红宝书上看到这样的讲解. 其核心意思是,在创建VBO时用 glBufferData(GL_ARRAY_BUFFER, len ...
- 父ListView嵌套子ListView时点击事件没有响应
转发请备注出处:http://www.cnblogs.com/LT5505/p/5972999.html 问题: 在ListView中嵌套ListView之后,子ListView会把父ListView ...
- .Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程
JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(60)-系统总结
系列目录 前言: 起初写这个框架的时候,可以说在当时来说并不是很流行的设计模式,那是在2012年,面向对象的编程大家都很熟悉, 但是“注入.控制反转(DI,IOC,依赖注入).AOP切面编程”新兴名词 ...
- Oracle迁移:Linux->Windows
源环境:RHEL6.4 + Oracle 11.2.0.4 目的环境:Windows 2003 需求:研发测试环境的Oracle数据库从Linux迁移到Windows,可以停机. 1.Windows安 ...
- ASM磁盘组扩容流程
环境:RHEL 6.5 + GI 11.2.0.4 + Oracle 11.2.0.4 1.确认磁盘权限正确 2.图形界面配置 3.启用asmca配置 4.修改磁盘组rebalance power级别 ...
- 匹夫细说C#:从园友留言到动手实现C#虚函数机制
前言 上一篇文章匹夫通过CIL代码简析了一下C#函数调用的话题.虽然点击进来的童鞋并不如匹夫预料的那么多,但也还是有一些挺有质量的来自园友的回复.这不,就有一个园友提出了这样一个代码,这段代码如果被编 ...
- 匹夫细说C#:可以为null的值类型,详解可空值类型
首先祝大家中秋佳节快乐~ 0x00 前言 众所周知的一点是C#语言是一种强调类型的语言,而C#作为Unity3D中的游戏脚本主流语言,在我们的开发工作中能够驾驭好它的这个特点便十分重要.事实上,怎么强 ...


