私は完全に言語としてScalaに興味がありますが、それでも、どの会社もJavaからScalaに切り替える必要があるのかということに苦労しています。ScalaはJVMの上にある単なるシンタックスシュガーですか、それともScalaにJavaよりも根本的な改善があり、実際のアプリケーションを改善するでしょうか?
私は完全に言語としてScalaに興味がありますが、それでも、どの会社もJavaからScalaに切り替える必要があるのかということに苦労しています。ScalaはJVMの上にある単なるシンタックスシュガーですか、それともScalaにJavaよりも根本的な改善があり、実際のアプリケーションを改善するでしょうか?
回答:
免責事項:私はScalaの第一人者ではありません。
Scalaは2つのことを非常にうまく行いますが、Java(現在)はそうではありません。
機能的な問題を解決する
最も基本的なレベルでは、Scalaはコレクションをサポートする完全なクロージャーを備えています。これは、次のようなボイラープレートコードを書く必要がないことを意味します(DZoneの投稿を恥知らずに取り除いた)
public List<Item> bought(User user)
{
List<Item> result = new ArrayList();
for (Item item : currentItems)
{
if (user.bought(item))
{
result.add(item);
}
}
return result;
}
ただし、代わりに次のように記述します。
def bought(user: User) = items.filter(user bought _)
より安全な方法で並行性を解決する
ScalaをJavaの頭上に立たせる他の要素を正直に考えることはできません。たくさんの小さな利益と改善がありますが、それ以上にロープを使い続けてください。YMMV
HTH少し
それは、「単なる構文糖」の定義に依存します。たとえば、Javaはマシンコード上の単なる構文上のシュガー以上のものです。
どの言語でもマシンコードよりも少ないことができますが、それ以上のことはできません。
高水準言語がテーブルにもたらすものは、コードを読みやすく、理解しやすく、構成しやすく、より多くのエラーをキャッチすることです。そして、私の意見では、最も違いを生むのはこれらの最初のものであり、正確には「単なる構文糖」です。
しかし、他の2つだけを考慮すると、Javaに対するScalaの利点はまだあります。
重要なことではありませんが、クロージャーを使用すると、クロージャーを使用しない場合よりもコードの構成がより簡単になります。また、Java 7はクロージャーと呼ばれるものを追加しますが、それはそうではなく、単に匿名関数になります。
より多くのエラーをキャッチすることに関しては、Scalaの優れた分散処理は、それが十分であることを証明しています。さらに、不変性に重点を置いているため、あらゆる種類のエラーを防ぐことができます。Javaが不変を行うことができないわけではありませんが、それを行うライブラリが付属していません。
私は今約3か月間Scalaを使用していますが、それでもJavaでできないことは何も見つかりません。私にとって文字通り、Scalaのすべての文献は、同じものの定型文について言及しているようです。あなたが探しているのが定型的なものを減らすことであるなら、Scalaはあなたのためですが、例えば、上記のフィルタの例はApacheコレクションを使用して同様に解決できます
<T> CollectionUtils.filter(Predicate<T>...)
またはそのようなクロージャーを使用します
<T> CollectionUtils.forAllDo(..., Closure<T>)
しかし、もちろんより冗長です。私は型推論が好きです。Scalaを学ぶと、これがおそらく内部で起こっていることであることに気付くでしょう。私の意見では、各言語には+ veと-veが付いています。
理解のために、リストの理解。
たとえば、javaでは次のように記述します。
int myVar;
if (condition) {
myVar = //some value
}
else {
myVar = //some other value
}
同じコードであるscalaでは、次のようにはるかにエレガントに記述されます(Pythonのように)。
int myVar = (//some value) if (condition) else // other value;
完了しました。
ScalaにはJavaにはないものがたくさんあります。まったく比較はありません。唯一の問題は、人々がJava(CSクラスで教えることであるb / c)に精通しており、まだScalaパラダイムに熟練していないことです。
Scalaには末尾再帰があり、タプル(Java 8で提供される可能性のあるもの)を返すことができます。
それは比較ではありません。Scalaは、Java Genericsの中核チームで働いていたMartin Orderskyによって開発されました。
Scalaは、はるかに優れた言語です。これですべてです。そうでないと言う人は、単にScalaを十分に理解していない。
上記では、末尾再帰の最適化(JVMはScalaのコンパイラができる方法を実行できません)を言うつもりでした。
また、ScalaはJVMアプリよりも高速にコンパイルおよび実行されます(はい、本当です)。フレームワークは言うまでもありません。たとえば、Tomcatを使用し、いくつかのサーブレットを展開してRESTを処理します。
Tomcatができないことの1つは、非ブロッキングI / Oを必要とする非同期操作です。このために、Java開発者は通常、メッセージキューを使用して回避策を考案しました(メッセージをキューに送信し、他のプロセスまたはスレッドがそれをピックアップして、バックグラウンドで必要な処理を行います)。
残念ながら、この方法はcr * pであり、TomcatにJavaサーブレットをデプロイする際の制限に対するハックです。
akka + sprayをご覧ください。scalaのアクターを使用します(アクターはスレッドに似ていますが、通信できる唯一の方法はメッセージを介しています)。
そして、非同期REST呼び出しが簡単になりました。長時間実行されるバックグラウンドタスク?問題ない。発火して忘れて、RESTポーリングをいくつか行って、時々フロントエンドからステータスを確認します。
まだJavaを使用しており、scalaよりも優れていると思う場合は、コンピューターを入力に使用するのをやめて、羽ペンとろうそくの明かりで書く時代に戻ってください。Javaは基本的にScalaと比較して時代遅れです。
int myVar = condition ? someValue : otherValue
//some value
//other value
コメントを編集して、/*some value*/
スタイルを設定したりする必要があります。現在、構文の強調表示が台無しになっています:p