JavaでScalaを使用する理由


16

私は完全に言語としてScalaに興味がありますが、それでも、どの会社もJavaからScalaに切り替える必要があるのか​​ということに苦労しています。ScalaはJVMの上にある単なるシンタックスシュガーですか、それともScalaにJavaよりも根本的な改善があり、実際のアプリケーションを改善するでしょうか?


4
これどこかで重複するようになりました。

2
あなたはそれをたくさん使ったようです(Scala)(まあ、私よりも)- あなたの個人的な経験で何見つけましたか?
FrustratedWithFormsDesigner

次のような質問を見ました... Java開発者はScalaをどう思うか、Java開発者として次に何をすべきか、JavaからScalaへの移行を開始するにはどうすればよいか...しかし、質問やこれは、Scalaを実世界の開発用のプログラミング言語として使用する理由に焦点を当てた回答です。
ダコタノース

1
@delnan、少なくともSO:stackoverflow.com/questions/6073517/…。@ DakotahNorth、SEサイト間でクロス投稿しないでください-あなたの質問に最適なフォーラムを選択し、そこにのみ投稿してください。他のサイトでは、SOでの投稿と同様に、投稿は閉じられます。
ペテルトレック

1
SOのもう1つのほぼ正確な複製で、優れた回答があります。stackoverflow.com
questions / 2683914 /…–PéterTörök11年

回答:


19

免責事項:私は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の可変データ+スレッドモデルのロックよりも継承的に安全なアクターモデル(+その他の優れた機能)があります(ライブラリがどれだけ優れていても、Javaは依然として言語によって妨げられます)。

ScalaをJavaの頭上に立たせる他の要素を正直に考えることはできません。たくさんの小さな利益と改善がありますが、それ以上にロープを使い続けてください。YMMV

HTH少し


3
akka(actor model)はScalaとJavaの両方で利用可能であることを指摘したいと思います。参照してくださいakka.io
ジョルジオ

5
私はScalaが好きで、JavaからScalaに移行しています。それでも、JavaとScalaを比較し、Scalaの開発者はできるだけ冗長で複数行のJavaコードを書き、それをScalaのワンライナーに置き換えることに一生懸命しようとするのに腹を立てます。読みやすさを失うことなく、Javaコードは12行ではなく5行に収まる可能性があります
マット

2
「多くの小さな利益と改善がありますが、自分自身をつなぐためのはるかに多くのロープもあります。」+1
ロブ

スニペットはなくJavaののCの中括弧の規則を使用し、特に以来@lucek:P
アンドレスF.

@robjb:「多くの小さな利益と改善はありますが、自分自身に固執するためのはるかに多くのロープもあります。」私はScalaがあなたに自分自身をつなぐためのより多くのロープを与えることに同意しません。少なくとも、答えにはこの声明の説明はなく、私自身はそれを見ることはできません。また、Scalaはオブジェクト指向言語(C#やJava 8など)にいくつかの機能的なイディオムを導入するだけでなく、OOPとFPを1つのパラダイムに統合しようとします。私見これは「小さな改善」ではなく、むしろパラダイムスイッチです。
ジョルジオ

9

それは、「単なる構文糖」の定義に依存します。たとえば、Javaはマシンコード上の単なる構文上のシュガー以上のものです。

どの言語でもマシンコードよりも少ないことができますが、それ以上のことはできません。

高水準言語がテーブルにもたらすものは、コードを読みやすく、理解しやすく、構成しやすく、より多くのエラーをキャッチすることです。そして、私の意見では、最も違いを生むのはこれらの最初のものであり、正確には「単なる構文糖」です。

しかし、他の2つだけを考慮すると、Javaに対するScalaの利点はまだあります。

重要なことではありませんが、クロージャーを使用すると、クロージャーを使用しない場合よりもコードの構成がより簡単になります。また、Java 7はクロージャーと呼ばれるものを追加しますが、それはそうではなく、単に匿名関数になります。

より多くのエラーをキャッチすることに関しては、Scalaの優れた分散処理は、それが十分であることを証明しています。さらに、不変性に重点を置いているため、あらゆる種類のエラーを防ぐことができます。Javaが不変を行うことができないわけではありませんが、それを行うライブラリが付属していません。


4
実際にJavaの「閉鎖」はJavaの8まで来ていない
マルタインVerburg

1
@Martijn修正してくれてありがとう。この時点で、私は実際にはもう気にしません。
ダニエルC.ソブラル

1
構文糖は、既存のセマンティクスに加えて、単なる代替構文であると思います。マシンコードのセマンティクスにはオブジェクト、クラスなどが含まれていないため、Javaはマシンコードに対する単なる構文上のシュガーではないと思います。セマンティクスとプログラミングのパラダイムは異なります。
ジョルジオ

@Martijn Verburg:Javaには既に(匿名内部クラスの形式で)クロージャーの形式があります。欠けているのは匿名関数です(これは、1つのメソッドといくつかの特別な構文を持つ特別な匿名クラスと考えることができます)。
ジョルジオ

@Giorgio-true、しかし、anon内部クラスは、今度のinvokedynamicベースの実装と比較してパフォーマンスが低く、ソースコードはいIMO :
Martijn Verburg

2

上にマルタインの答え私は、Scalaは以上であることを追加したいと思い、表現 Java以外と利点は、それは(1)は、それはあなたがより生産的になります(2)あなたがバグを減らすことができ、同じ問題の解決手段に少ないコードを書いて、あなたのコード(バグのないIMHOコードは神話です)。


0

私は今約3か月間Scalaを使用していますが、それでもJavaでできないことは何も見つかりません。私にとって文字通り、Scalaのすべての文献は、同じものの定型文について言及しているようです。あなたが探しているのが定型的なものを減らすことであるなら、Scalaはあなたのためですが、例えば、上記のフィルタの例はApacheコレクションを使用して同様に解決できます

<T> CollectionUtils.filter(Predicate<T>...)

またはそのようなクロージャーを使用します

<T> CollectionUtils.forAllDo(..., Closure<T>)

しかし、もちろんより冗長です。私は型推論が好きです。Scalaを学ぶと、これがおそらく内部で起こっていることであることに気付くでしょう。私の意見では、各言語には+ veと-veが付いています。


-3

理解のために、リストの理解。

たとえば、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と比較して時代遅れです。


4
これはリストの理解の例ではありません。そして、Javaで次のように記述:int myVar = condition ? someValue : otherValue
ケビン・クライン

1
これらの//some value //other valueコメントを編集して、/*some value*/スタイルを設定したりする必要があります。現在、構文の強調表示が台無しになっています:p
KChaloux
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.