問題タブ [functional-java]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java-8 - Functionaljava: 任意の型のリストのソート
フィールドを持つ非常に単純な Java BeanWatchedFile
がありfileName
ます。
fj.data.List
オブジェクトの をソートしたいのですが、リストのメソッドのWatchedFile
を定義するのに苦労しています。これは私が思いついたものです:fj.Ord
sort()
これは醜いです!オブジェクトをインスタンス化するより良い方法があると確信していOrd
ます...おそらくJava 8の魔法を利用していますか?
functional-java - 既存の注文から注文を作成
がある場合、既存のものを に変換F<A, B>
するにはどうすればよいですか?Ord<A>
Ord<B>
例えば:
java - 列挙からの無限ストリーム
Functional-Java では、以下が無限ストリームを作成することを期待していました。
しかし、完全な列挙を 1 回行うと停止します。javadoc の種類はこれを確認し、列挙が使い果たされるまでしかストリーミングできないと述べています。
では、どうすれば無限ストリームを作成できますか?
java - Functional Java: Maven からのインポート
新しいマシンで Maven プロジェクトのクローンを作成しましたが、依存関係が読み込まれていないように見えるため、いくつかの問題が発生しています。そのようなケースの 1 つはfj.Effect
、Functional Java です。適切なライブラリを (手動で) 追加しているかどうかわかりません。
コードには、次のものがあります。
追加しようとしましたがorg.org.functionaljava:functionaljava-java8:4.32
、org.functionaljava:functionaljava:4.3
IntelliJ は認識Effect
しますが、最初の行をエラーとして強調表示し、次のように言います: 別の行に同様の問題があります:
型 fj.Effect には型パラメーターがありません。
間違ったパッケージをインポートしていませんか?
より一般的には、既存のコードに基づいて、使用すべきパッケージを知る方法はありますか?
java - fj.data.Set 比較
では、 メソッドをjava.util
使用しcontainsAll
て 2 つの を比較できますjava.util.Set
。2つを比較する最良の方法は何fj.data.Set
ですか?
fj
overを使用することの「価値のある」利点は本当にありますjava.util
か?
java - Fugue/FunctionalJava を使用して Null とスローから離れますか?
さて、私は長い間 OO 開発者として、この「新しく発見された」関数型プログラミングの世界に入ろうとしています - 少なくとも、これに関係しているので、Java の世界には存在しないようnull
にコーディングしようとしています。とモナドをいじるthrow
ことによって。(少なくとも、それらはモナドだと思います。私はまだその用語と、それを正しく使用しているかどうかに慣れていません...) 私はAtlassian Fugueライブラリから離れます。Functional Javaライブラリーを調べてみましたが、現時点で準備ができているよりもはるかに大きいです。もし fj が私が必要とすることを行い、Fugue がそうでないなら、私はそれで大賛成です。Option
Either
基本的に、私が達成しようとしているのは、このやや醜い Java コードと同等です。
単純に、モナドを使用して、次のEither
ようなことができると期待していました。
...ここで、ロジックっぽいメソッドのそれぞれが、適切な例外 (おそらくドメイン固有のエラー クラスですが、今のところ例外は十分に機能します) を左に、Option<something>
右に an を含む Each を返します。メソッドはdoSomethingWith...
、エラーに対して実行したいロギング/処理を実行します。ロジックっぽいメソッドの例は次のとおりです。
他のメソッドも同様に定義されます。パラメータに を使用しないことが望ましいです。Option
前のメソッドが を返した場合、メソッドは単に呼び出されませんOption.none
。
これを実際にテストすることを妨げたジェネリック型からのコンパイラエラーのラットネストは別として、論理的には、とにかく私が望むことを実際に行うようには見えません-最初の後に基本的に何もしないことを期待していましたEach.left 値が返されましたが、もっとよく見ると、Either.left の結果を次の呼び出しに渡して、さらに続けようとしていると思います。
オプションをwas
使用するだけで、目標を達成することができます。
残念ながら、元のブロックと同じロジックを実現するために、ロジック メソッドは次のように実装されます。
.map
結果を に持ち上げるので、ここOption
に戻るnull
とうまくいきます。残念ながら、私はまだ本質的に呼び出し元からエラー状態を隠しています (さらに悪いことに、エラーを示すために使用しています。これは、 doProcessing が潜在的に有効な理由でnull
返されるかどうかについては何も言っていません)。null
したがって、基本的には、以前の getMessage の例に沿ったメソッド シグネチャが必要です。
戻り値を見て、「このメソッドは失敗するか、あるかもしれないし、ないかもしれない何かを返すだろう」と一目でわかるという考えが好きです。ただし、私は FP に慣れていないため、どうすればよいかわかりません。
そして、私の理解では(おそらく欠陥がありますが)、次のようなことができるということです
(おそらく異なる方法で)それは
- Each.left が処理された後はいつでも処理を停止します (つまり、適切な
doSomethingWithXException
メソッドを呼び出して停止します) 。 - チェーン全体を続行します。
doSomethingWithAwesomeStuffException
への呼び出しが失敗した場合にのみ呼び出しawesomeStuff
ます。他のメソッドが失敗した場合は、それに到達しません。
私がやろうとしていることは合理的ですか?つまり、何らかの方法で可能だと確信していますが、これらのライブラリ (または私が知らない他のライブラリ) のいずれかを使用しても、これを Java 構文に押し込むのは複雑すぎますか?
java - Java のさまざまな Optional/Option セマンティクス
Java エコシステムでおそらく最も使用されている 3 つの実装 (Java 8、Functional Java、および Guava) で、さまざまな Option/Optional セマンティクスの背後にある理由を理解しようとしています。
次の 3 つのスニペットを検討します。
java.util.Optional.of(100).map(i -> null)
になりますOptional.empty
。fj.data.Option.some(100).map(i -> null)
になりますSome(null)
。com.google.common.base.Optional.of(100).transform(i -> null)
結果NullPointerException
。
3つの選択の背後にある理由は何ですか? 該当する場合、関数型プログラミングの観点から最も「純粋」または「正しい」と考えられるものは何ですか? たとえば、Option
型をモナドと見なすという点では、何が最も正しいでしょうか。または、最も構成可能と見なすことができるものは何ですか? null を許可する関数型言語でこれがどのように処理されるかを知ることも興味深いでしょう。