[解決済み] Java 8: java.util.function の TriFunction (と kin) はどこにあるのでしょうか?または代替は何ですか?
質問内容
java.util.function.BiFunctionを見ると、これができるんですね。
BiFunction<Integer, Integer, Integer> f = (x, y) -> { return 0; };
それではダメで、TriFunctionが必要だとしたらどうでしょう? それは存在しない!
TriFunction<Integer, Integer, Integer, Integer> f = (x, y, z) -> { return 0; };
私は、独自のTriFunctionを定義できることは知っていますが、それを標準ライブラリに含めないことの根拠を理解しようとしているのです。
どのように解決するのか?
私の知る限り、関数には破壊的なものと建設的なものの2種類しかありません。
建設的な関数は、その名の通り何かを建設するのに対して、破壊的な関数は何かを破壊するのですが、あなたが今考えているような方法ではありません。
例えば、関数
Function<Integer,Integer> f = (x,y) -> x + y
は
構成的
の1つです。
何かを構築する必要があるように この例では
というタプルを構築しました。
(x,y)
. 構成的関数には問題があります。
無限の引数を処理することができないからです。しかし、最悪なのは
引数を空けることはできない。さて、x := 1" と言って、試しに
あなたが試したいと思うすべてのy。というタプル全体を毎回構築しなければならない。
x := 1
. というわけで、関数が何を返すのか見たい場合は
y := 1, y := 2, y := 3
あなた
と書かなければなりません。
f(1,1) , f(1,2) , f(1,3)
.
Java 8では、構成的ラムダ関数を使う利点があまりないため、構成的関数は(ほとんどの場合)メソッド参照を使って処理されるべきです。これは、静的メソッドに少し似ています。 使用することはできますが、実際の状態を持ちません。
もうひとつは破壊的なタイプで、何かを受け取って必要な範囲で解体します。 例えば 破壊的 機能
Function<Integer, Function<Integer, Integer>> g = x -> (y -> x + y)
は、この関数と同じように
f
これは建設的なものです。破壊的な関数の利点は
無限大の引数を扱えるようになり、特にストリームでは便利です。
というわけで、もしもう一度
x := 1
と
y := 1 , y := 2 , y := 3
と言うことができます。
h = g(1)
と
h(1)
は
y := 1
,
h(2)
について
y := 2
と
h(3)
に対して
y := 3
.
つまり、ここでは状態が固定されているのです! これは非常にダイナミックで、ラムダが必要とするのは大抵の場合これです。
Factoryのようなパターンは、自分のために仕事をしてくれる関数を置くことができれば、とても簡単です。
破壊的なもの同士は簡単に組み合わせられる。型が正しければ、好きなように合成すればいいのです。これを使えば、モルヒズムを簡単に定義できるので、(イミュータブルな値を使った)テストがとても簡単になりますよ。
破壊的な構成はリストやデコレータのようにきれいに見えますが、構成的なものはツリーによく似ています。そして、バックトラックのようなもの 構成的関数の場合は、ただ単に不愉快なだけです。破壊的な関数の部分関数を保存しておいて(動的計画法)、"backtrack" で古い破壊的な関数を使えばいいんです。そうすれば、コードはずっと小さくなり、読みやすくなります。構成的関数の場合、多かれ少なかれ、すべての引数を覚えておかなければなりませんが、それはとても大変なことです。
では、なぜ
BiFunction
がないことの方が問題でしょう。
TriFunction
?
まず、多くの場合、いくつかの値(3つ未満)があり、結果だけが必要です。したがって、通常の破壊的な関数はまったく必要なく、構成的な関数で十分です。また、モナドのようなものもあります。
は本当に構成的な関数が必要です。しかし、それを除けば、なぜ
BiFunction
ということです。だからといって、削除する必要はありません。私は死ぬまでモナドのために戦います!
ですから、論理的なコンテナ・クラスにまとめられないようなたくさんの引数がある場合、そして、その引数を使った 関数は建設的でなければならないので、メソッド参照を使用します。そうでなければ、破壊的な関数という新しく獲得した能力を使ってみてください、あなたはより少ないコード行数で多くのことを行っていることに気づくかもしれません。
関連
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] Java の配列を表示する最も簡単な方法は何ですか?
-
[解決済み] Javaで数値を小数点以下n桁に丸める方法
-
[解決済み] Java 8 List<V> を Map<K, V> に変換する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:'if'のない'else'エラー
-
[解決済み】エラー:配列または java.lang.Iterable のインスタンスに対してのみ反復処理を行うことができます。
-
[解決済み】HTTPステータス500 サーブレットクラスのインスタンス化エラー [重複]。
-
[解決済み】「java -cp」と「java -jar」の違い?
-
[解決済み】JLabelのテキストを中央に配置するには?
-
[解決済み】Javaメソッドスタブ
-
[解決済み】純粋なJUnitテストにVisibleForTestingを使用する方法
-
[解決済み】koch snowflake java recursion
-
[解決済み】Eclipseで「パッケージエクスプローラー」ビューが見つからない
-
[解決済み] SQLエラー。0, SQLState: 08S01 通信リンクの失敗 [重複]。