私はあちこちで Scala について読んでいますが、Java 開発者が Scala に飛びつくことから何が得られるのか理解できませんでした。
関数型プログラミングと関係があると思います。
Java ではできないことの具体例を教えてください。Scala に行けば助かりますか?
これは、Java やそれに類するものに対する批判を意図したものではありません。Scala の使用法を理解するだけで十分です。
4 に答える
私もJavaの世界から飛び降りています。最初にあなたを救うと思うのは、Scalaには、コードをシンプルでクリーンに保つのに役立つコンパイラーの魔法がたくさんあるということです。
たとえば、Scalaのcaseクラスがどのように役立つかを次に示します。これを使用して、クラスを定義できます。
case class Student(name: String, height: Double, weight: Double)
これの代わりに:
class Student {
public final String name;
public final String height;
public final String weight;
public Student(String name, double height, double weight) {
this.name = name;
this.height = height;
this.weight = weight;
}
}
はい、それだけです。自分でコンストラクターを作成する必要はありません。これらすべての、、equals
メソッドhasCode
をtoString
無料で利用できます。
この単純なケースでは大したことではないように見えるかもしれませんが、関数型プログラミング構造を使用していない場合でも、Scalaを使用するとOOで物事をはるかに簡単かつ迅速にモデル化できます。
また、高階関数やその他の関数型プログラミング構造も、Scalaの問題を解決するための強力なツールを提供します。
アップデート
OK、以下は関数型プログラミングがコードをより理解しやすく、きれいにする方法の例です。
関数型プログラミングは大きなトピックですが、私がJavaの世界から来て、モナドや型クラスなどが何であるかを理解していない場合でも、Scalaの関数型プログラミング構造は問題をより簡単かつ表現力豊かに解決するのに役立ちます。
コレクションを繰り返し処理し、コレクション内の要素に対して何かを行う必要がある場合が多くあります。これは、何をするかを決定する条件によって異なります。
簡単な例として、Javaでリストを反復処理し、サイズがゼロのすべてのファイルを削除する場合。Javaで行うことは、おそらく次のようになります。
List<File> files = getFiles()
for (File file: files) {
if (file.size() == 0) {
file.delete();
}
}
とても簡単で簡潔ですね。しかし、Scalaの関数型プログラミング構造を使用すると、次のことができます。
val files = getFiles()
val emptyFiles = files.filter(_.size == 0)
emptyFiles.foreach(_.delete())
ご覧のとおり、Javaのバージョンよりもコードが少なく、意図も明確です。サイズが0のすべてのファイルをフィルターで除外し、すべてのファイルに対してそれを呼び出しますFile.delete()
。
最初は奇妙に見えるかもしれませんが、慣れて正しい方法で使用すると、コードが非常に読みやすくなります。
この手法はJava(Function Java)で可能ですが、最終的には次のコードのようになります。
list.filter(new Predicate<File>() {
public boolean predicate(File f) {
return f.size() == 0;
}
})
これは、元のforループバージョンであるIMHOに固執します。
あなたの質問を具体的にするには:
- scalaではパターンマッチができます
- scala には高階関数があります (これはjava8 ラムダと同じではありません)
- 無名関数リテラル
- 強い型推論
- 遅延評価
- 分散注釈
- より高い種類のタイプ
- 特性を使用した mixin 動作 (スタック可能な構成)
- 暗黙の定義と変換
- xml リテラル
- REPL
続けることもできますが、少なくともいくつかのドキュメントを読むことをお勧めします。
たとえば、ここから開始できます
まず始めに、Graham Lea によるこの記事では、Scala が生産性を向上させる多くの方法をリストしています。
それは次のように始まります。
- 幅広く強力なコレクション フレームワーク
- ボイラープレートを大幅に削減する収集方法
- ミューテーション メソッドを持たない不変コレクション (リストが不変の場合に List.add() が例外をスローする java.util クラスとは異なります)
- 数字、列挙型、文字、文字列に一致するだけでなく、独自のクラスであっても、多くの異なるクラスのあらゆる種類のパターンに簡潔に一致できる素晴らしいスイッチのような関数
- (リフレクションを使用せずに) フィールドが変更されないクラスに対して、意味のある equals、hashCode、および toString メソッドを自動的に書き込むアノテーション
- ...
そしてリストは続きます。