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依存の追加
            <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> 
    

    コードの例
  • bean
  • 
    @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 = _
    
    }
    
    
  • dao
  • 
    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]
    
    }
    
    
    
  • Controller例
  • 
    
    @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)
    
    }