13

教えるコースでは、Functional JavaまたはGuava(またはScalaの可能性は低い)のいずれかを使用したいと思います。JVMで実行される関数型言語はたくさんありますが、Javaにできるだけ似ているもの、つまり、Java 8で期待される関数型機能と、概念的および構文的に最も互換性のあるものに固執したいと思います。 。

FunctionalJavaGuavaが最適な候補のようです。機能、使いやすさ、ストレートJavaとの概念的な近さなどの点で、それらを比較するものは何も見つかりませんでした。これらのライブラリ間の優れた比較を知っている人はいますか?

4

3 に答える 3

17

Guavaの目標は、Javaで機能的なイディオムを提供することではありません。機能的に説明されたGuavawikiページから:

Guavaの関数型プログラミングイディオムを過度に使用すると、冗長で、混乱を招き、読みにくく、非効率的なコードになる可能性があります。これらはGuavaの最も簡単に(そして最も一般的に)悪用される部分であり、コードを「ワンライナー」にするために途方もない長さに行くと、Guavaチームは泣きます。

Guavaの機能ユーティリティを使用するときは、従来の命令型の方法が読みやすくないことを確認してください。書き出してみてください。そんなに悪かったですか?それは、あなたが試みようとしていた途方もなく厄介な機能的アプローチよりも読みやすかったですか?

機能的なイディオムに過度に傾くことは、オーバーヘッドが高すぎるため、Java 7まではあまり意味がありません(垂直方向の問題を参照)。これはJava8で変更され、Javaライブラリとプログラムの詳細レベルでの設計方法が変更されます。7までのJavaで意味のあることは、Java 8ではある程度推奨されません。これにより、EffectiveJavaの新しいエディションと多くの新しいAPIが動機付けられます。

関数型プログラミングを教えようとしているのであれば、(多かれ少なかれ)純粋な関数型言語に固執する方がおそらく良いでしょう。FPとOOPのメランジ(またはエミュレーション)であるすべての言語は気を散らすものになります。

于 2011-12-23T05:31:39.733 に答える
6

上で述べたように、Guavaは単なるJavaライブラリであり、Java 5互換のライブラリです(リリース11以降)。関数型プログラミングにおけるGuavaの位置付けは、KevinBourrillionによって要約されています。

「構文は最悪です。同時に、このようなものは、適切な言語の変更が行われるまでの一時的な手段に過ぎません。その時点で、最終的に最適な構文を決定し、機能スタイルのプログラミングを開始できます。実際にJavaでの生活を一度だけ良くします。ですから、関数/述語にどれだけの労力を費やすかは未定です。それは、それが王冠の宝石であると私たちが考えるからではなく、ある種でなければならなかったので、もっと図書館にあります。」</ p>

于 2011-12-23T10:50:39.140 に答える
4

Guavaは、たまたま関数型イディオムを備えた汎用ライブラリであり、Functional Javaは純粋にJavaで関数型イディオムを実装することを目的としているため、Functional Javaは、おそらくより完全なFPのような機能のセットにより適しているように思えます。

反対に、Guavaはより汎用的であるため、私はGuavaを好みます。したがって、機能的なイディオムとは関係のないいくつかの機能を使用していることに気付きます。

両方のライブラリの問題の1つ(上記の投稿のGuavaのWikiに記載されているように)は、関数オブジェクトの匿名内部クラスの「垂直ノイズ」です。アノテーションとAPTを介してこれを修正しようとする別のライブラリはJediです。

上記のライブラリ(Guava、FJ、またはJedi)のいずれかを注釈なしでノイズを少なくする別のアプローチは、Mockitoの構文に触発されて私が書いたライブラリFuncitoです。この時点で単純化できるものはさらに制限されており、基本的に単一のメソッド呼び出しをラップしますが、それは私が現在ほとんどの時間ですでに行っていることです。

于 2012-02-06T23:45:02.953 に答える