Javaが不足している人のためのScalaについて

進歩はまだ止まっておらず、人々は新しいソリューションを探しており、JVMにはますます興味深い言語が登場しています。 しかし、JVMコミュニティの「コア」は厳しい人々であり、深刻な標準に慣れており、高い要求を持っています。 したがって、ほとんどの新しい言語は「周辺」にかかっています。



Scalaは、JVMの他の言語とは非常に徹底したアプローチで異なります。Java1.5のジェネリックシステムの設計者としても知られるMartin Odersky教授が率いる最も強力な欧州EPFL研究所の研究室は、この言語で動作します。 もちろん、これはサポート量の観点から、SunやMicrosoftのような本格的な商業オフィスと比較することはできません。そのため、言語はゆっくりと開発され、ごく最近「ビジネスに参入」しました。

scala Job Trendsグラフ



それについて何が面白いですか?



まず第一に、Java開発の手荷物の通常の構文とアクセシビリティ、およびそれとの自由な混合-既存のJavaプロジェクトに複数のScalaクラスを安全に追加でき、すべてが機能します(ScalaにはJavaから利用できない拡張機能がありますが、通常は反対を決定することは難しくありませんすべてが100%アクセス可能です)。



簡潔で表現力豊かなコード



最も単純なタイプの推論と構文の緩和から始めます。

  def toString = "a:" + a //メソッド
 val map = Map(1-> "one"、2-> "two")// map:Map [Int、String] 


タプル(タプルです):

  def error =( "Not found"、404)//メソッド
 val(msg、code)= error // msg == "Not found"、code == 404 


機能的なコレクションで終わる:

 リスト(1、2、3、4、5).filter(_%2 == 1).map(_ * 2).mkString( "、")// "2,6,10" 


特性の混合(Javaのインターフェースのような、実装の可能性のみ):

  valハンドラ= TransactionSupportでAdminRoleRequiredでログを記録する新しいDefaultHandler 


暗黙的な変換によるクラスの拡張(プリミティブ型を含む):

  val date = today + 1.month + 5.days 


そして、もちろん、ケースクラス:

  case class Person(name:String、age:Int)// getters、equals、hashCode、toStringなど
 val p = Person( "Vasia"、12) 




機能的アプローチとオブジェクト指向アプローチの定性的組み合わせ



Scalaは、静的型付けと、機能的アプローチとオブジェクト指向アプローチのよく考えられた(そして学位論文に裏打ちされた)混合を備えた最初の「ワイドプロファイル」言語です。



明らかではありませんが、このアプローチは実際にはそのシンプルさと信頼性に驚きます-関数型プログラミングは、変更可能な状態を最小限に使用することを教えて(同じこととそれと一緒に暮らすことを忘れないでください)、プログラムを多くの小さく、よく読んで、自動的に簡単にテストされるメソッド、強力なタイピングおよび特性により、要件を明確に設定し、小さなエラーの束を回避できます(コンパイルされた場合、動作します)。



Scalaボリューム仕様-少ないJava仕様



Scalaコミュニティの1つのタイプは最近、「C ++とは異なり、Scalaを学習すればするほどシンプルになります」と述べています。 実際、これがこの言語の主な目的であり、その名前であるSCAlable言語でもあります。 仕様には基本的なもののみが記載されていますが、それらに基づいて、言語の一部のように見え、複雑な産業システムの構築に使用できる新しい便利なデザインを構築できます。 同時に、構文の弱点(ブラケット、戻り値の型など、多くの構造を省略できる)のため、この言語は単純なスクリプトでも便利です(クラスなしで.scalaファイルを記述し、スクリプトとして実行できます)。

説明のために、 ScalaのBASICに関する最近の投稿。



貴重な毛皮だけでなく



上記の「アメニティ」に加えて、名前付きパラメーターとデフォルトパラメーターがあります。

  def box(width:Int = 100、height:Int = 200)= ... //メソッド
 box(height = 300)// box(100、300)と同じ 


名前ごとのパラメーター(必要な場合のみ計算):

  def debug(msg:=> String)= if(debugEnabled)println(msg)
 debug( "Debug message:" + heavyMethod())// heavyMethodはdebugEnabledの場合にのみ呼び出されます 


遅延初期化(最適化されたスレッドセーフ):

  class Context {lazy val(user、password)= {/ *重い初期化* /}} 


ソースコードでのXMLサポート:

  def description = <div> <h4> {label} </ h4> {text} </ div> 


高度なアクセスレベルシステム:

  protected [package] val a //パッケージと相続人に見える
 private [this] val b //このクラスのこのインスタンスにのみ可視 


そしてもちろん、非常に強力なパターンマッチング:

 ケースクラスAddress(市:文字列、通り:文字列)
ケースクラスPerson(名前:文字列、年齢:Int、アドレス:アドレス)
 somePersonマッチ{
   case Person( "Vasia"、_、_)=> ... // name == "Vasia"、残りは重要ではありません
   case Person(_、n、_)if n <18 => ... //年齢<18
   case Person(_、_、Address(_、 "Apricot"))=> ... // Apricot Streetからのみ
   case _ => ... //その他すべて
 } 




その他



興味深いものすべてを1つの投稿に集めることは非常に困難です。 多すぎる。 一度でも覚えていません。 他に何を追加しますか:





私について:私は約10年間Javaでプログラミングを行ってきました。昨年、当局に私たちのプロジェクトでScalaを試すよう説得しました。最初のプロジェクトは、自己文書化JSON / REST Webサービスで、誰もがそれを気に入っていました。今では、素晴らしいWebインターフェイスの試用版(3500 Javaクラス)Scala + Vaadinで。



All Articles