JAva-scala高効率ハイブリッド開発
JAva scalaハイブリッド開発
有名な応用 Kafka(メッセージシステム) Spark(計算エンジン) Play(次世代webフルスタックフレームワーク) Akka(高伸縮性JavaとScalaのActorモデル応用) scalaの利点
Scalaは面白い言語です.多くの言語の優れた特性を継承する一方で、Javaという強力なプラットフォームを捨てず、Java仮想マシン(Java Virtual Machine)の上で動作し、Javaクラスライブラリの相互接続を容易に実現し、豊富にしています.オブジェクト向けのプログラミング方式と関数式のプログラミングをサポートします.動的言語のように簡潔に書かれていますが、実際には厳密な意味での静的言語です.Scalaは武林の集大成者のように、過去数十年間のコンピュータ言語の発展の歴史の中の精巧さを一身に集め、簡素化した.
Javaとの違い
Javaに比べてScalaのコードはより簡素(エラーを低減)であり、機能がより広く(Scalaは実はScalable Languageの略称であり、拡張可能な言語を意味する)、多くのScalaの特性と文法はJavaの不足と弱点に対して設計されている.Scalaの特徴は,不活性評価,list comprehension,type inference,anonymous function,pattern matchingなど,多くの関数式言語の特性(例えばML,Miranda,Scheme,Haskell)があり,Object-Ortedの特性も含まれている(OOはFPと混合して使用できるのがScalaのハイライトである).また、高度なプログラミング言語に似た多くの文法も浸透しており(例えばPython)、Scalaコードの可読性を向上させるだけでなく、メンテナンス、修正も時間と労力を節約します.ScalaとJavaの文法上の明らかな違いは、セミコロン末尾タイプ定義の先頭を必要としない大文字(Haskellと同じ)関数定義のdef先頭(Python、Rubyと同じ)returnを省略できることです.
特長
機能は多くて、文法は複雑で、JVMの上のC++と称します
紹介する
Javaとscalaのハイブリッド開発により、開発効率を大幅に向上
maven依存の追加
プラグインの追加
コードの例 bean dao Controller例
有名な応用
Scalaは面白い言語です.多くの言語の優れた特性を継承する一方で、Javaという強力なプラットフォームを捨てず、Java仮想マシン(Java Virtual Machine)の上で動作し、Javaクラスライブラリの相互接続を容易に実現し、豊富にしています.オブジェクト向けのプログラミング方式と関数式のプログラミングをサポートします.動的言語のように簡潔に書かれていますが、実際には厳密な意味での静的言語です.Scalaは武林の集大成者のように、過去数十年間のコンピュータ言語の発展の歴史の中の精巧さを一身に集め、簡素化した.
Javaとの違い
Javaに比べてScalaのコードはより簡素(エラーを低減)であり、機能がより広く(Scalaは実はScalable Languageの略称であり、拡張可能な言語を意味する)、多くのScalaの特性と文法はJavaの不足と弱点に対して設計されている.Scalaの特徴は,不活性評価,list comprehension,type inference,anonymous function,pattern matchingなど,多くの関数式言語の特性(例えばML,Miranda,Scheme,Haskell)があり,Object-Ortedの特性も含まれている(OOはFPと混合して使用できるのがScalaのハイライトである).また、高度なプログラミング言語に似た多くの文法も浸透しており(例えばPython)、Scalaコードの可読性を向上させるだけでなく、メンテナンス、修正も時間と労力を節約します.ScalaとJavaの文法上の明らかな違いは、セミコロン末尾タイプ定義の先頭を必要としない大文字(Haskellと同じ)関数定義のdef先頭(Python、Rubyと同じ)returnを省略できることです.
特長
機能は多くて、文法は複雑で、JVMの上のC++と称します
紹介する
Javaとscalaのハイブリッド開発により、開発効率を大幅に向上
maven依存の追加
<dependency>
<groupId>org.scala-langgroupId>
<artifactId>scala-libraryartifactId>
<version>${scala.version}version>
dependency>
プラグインの追加
<plugin>
<groupId>org.scala-toolsgroupId>
<artifactId>maven-scala-pluginartifactId>
<executions>
<execution>
<goals>
<goal>compilegoal>
<goal>testCompilegoal>
goals>
execution>
executions>
<configuration>
<recompileMode>incrementalrecompileMode>
<scalaVersion>${scala.version}scalaVersion>
<launchers>
<launcher>
<id>appid>
<mainClass>xxxxmainClass>
<args>
<arg>-deprecationarg>
args>
<jvmArgs>
<jvmArg>-Xms256mjvmArg>
<jvmArg>-Xmx2048mjvmArg>
jvmArgs>
launcher>
launchers>
configuration>
plugin>
<plugin>
<groupId>org.codehaus.mojogroupId>
<artifactId>build-helper-maven-pluginartifactId>
<version>1.8version>
<executions>
<execution>
<id>add-resourceid>
<phase>initializephase>
<goals>
<goal>add-resourcegoal>
goals>
<configuration>
<resources>
<resource>
<directory>${basedir}/src/main/resourcesdirectory>\
<filtering>truefiltering>
<excludes>
<exclude>**/*.javaexclude>
excludes>
resource>
resources>
configuration>
execution>
<execution>
<id>add-sourceid>
<phase>initializephase>
<goals>
<goal>add-sourcegoal>
goals>
<configuration>
<sources>
<source>${basedir}/src/main/javasource>
<source>${basedir}/src/main/scalasource>
sources>
configuration>
execution>
<execution>
<id>add-test-sourceid>
<phase>initializephase>
<goals>
<goal>add-test-sourcegoal>
goals>
<configuration>
<sources>
<source>${basedir}/src/test/javasource>
sources>
configuration>
execution>
executions>
plugin>
コードの例
@Entity
class LazyTask {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@BeanProperty
var id: Integer = _
@BeanProperty
var url: String = _
@BeanProperty
var name: String = _
// : -1 0 1
@BeanProperty
var state: Integer = _
@BeanProperty
var owner: String = _
@BeanProperty
var resultJson: String = _
@BeanProperty
var executeTimes: Integer = _
@BeanProperty
var executor: Integer = _
@BeanProperty
var gmtCreate: Date = _
@BeanProperty
var gmtModify: Date = _
}
trait LazyTaskDao extends CrudRepository[LazyTask, Integer] {
def findAll(): List[LazyTask]
def save(t: LazyTask): LazyTask
def findOne(id: Integer): LazyTask
@Query(value = "SELECT * FROM lazy_task where url like '%?1%'", nativeQuery = true)
def listByUrl(url: String): List[LazyTask]
@Query(value = "SELECT * FROM lazy_task where name like '%?1%'", nativeQuery = true)
def listByName(name: String): List[LazyTask]
}
@RestController
class LazyTaskController @Autowired()(val lazyTaskDao: LazyTaskDao,
val phantomjsExecutor: PhantomjsExecutor,
val domainConfig: DomainConfig) {
@RequestMapping(value = {
Array("/newTask.do")
})
def newTask_do() = {
new ModelAndView("ylazy/newTask")
}
@RequestMapping(value = {
Array("/ylazy/newTask")
}, method = Array(RequestMethod.POST))
@ResponseBody
def newTask(@ModelAttribute lazyTask: LazyTask) = {
lazyTask.gmtCreate = new Date
lazyTask.gmtModify = new Date
lazyTask.executeTimes = 0
lazyTask.state = -1
lazyTaskDao.save(lazyTask)
}
@RequestMapping(value = {
Array("/list.do")
})
def list_do(model: Model) = {
model.addAttribute("lazyTaskList", lazyTaskDao.findAll())
model.addAttribute("domainName", domainConfig.getDomainName)
model.addAttribute("port", domainConfig.getPort)
new ModelAndView("ylazy/list")
}
/**
*
*
* @param id
* @return
*/
@RequestMapping(value = {
Array("/lazytask")
}, method = Array(RequestMethod.GET))
@ResponseBody
def findOne(@RequestParam(value = "id") id: Integer) = lazyTaskDao.findOne(id)
/**
* json
*
* @param id
* @return
*/
@RequestMapping(value = {
Array("/result/{id}")
}, method = Array(RequestMethod.GET))
@ResponseBody
def findResultJson(@PathVariable(value = "id") id: Integer) = lazyTaskDao.findOne(id).resultJson
/**
*
* @param id
* @return
*/
@RequestMapping(value = {
Array("/ylazy/runTask")
}, method = Array(RequestMethod.GET))
@ResponseBody
def runTask(@RequestParam(value = "id") id: Integer) = {
phantomjsExecutor.ylazyById(id)
}
@RequestMapping(value = {
Array("/ylazy")
}, method = Array(RequestMethod.GET))
@ResponseBody
def ylazy(@RequestParam(value = "url") url: String) = phantomjsExecutor.ylazy(url)
}