問題タブ [functional-interface]
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 - Java 8 の関数型インターフェイスに抽象メソッドが 1 つあるのはなぜですか?
Java 8 でわかっているように、関数型インターフェースの概念が導入されました。Functional Interface には 1 つのabstract
メソッドがあり、いくつかのデフォルトまたは静的メソッドが可能です。
しかし、Functional インターフェースに抽象メソッドが 1 つしかないのはなぜでしょうか? インターフェイスに複数の抽象メソッドがある場合、なぜこれが機能インターフェイスではないのですか?
java - FunctionalInterface Comparator には 2 つの抽象メソッドがあります
Java 8 ラムダを学習していて、ラムダ式に使用する Comparator のどのメソッドをコンパイラがどのように認識しているのか疑問に思っていますか? SAMインターフェースじゃないみたい?2 つの抽象メソッドがあります。
java - Java 8 での Lambda を使用した例外処理
ラムダ式を使用していくつかのテストを行っていますが、コードがコンパイルされません。私のラムダ実装は間違っていますか、それとも例外処理ですか? 次のコードの正しい実装は何ですか?
try catch ブロックを削除し、メソッドでスローする例外を宣言すると、コードは正常にコンパイルおよび実行されます。
コンパイルエラーは次のとおりです。
incompatible types: bad return type in lambda expression
java - Java-8-Functional-Interface を構成する
次のような Java-8-FunctionalInterface があります。
Function
-Interface は -Method を提供しますcompose
。私はそれを使用して、次のようなストリームを減らしたいA
:
その結果、各Stream でそのメソッドA
を呼び出すの関数が必要です。A
doIt
しかし、Aはの実装者ではないため、そこでFunction
メソッド参照Function::compose
はできません。Function
(または)から拡張することはできませんSupplier
。これは、2 つの抽象メソッド (自分自身のメソッドと からのメソッド) を持つことになるためFunction
です。
の関数を構成することを可能にするために、何ができA
ますか?
java - 親インターフェイスのデフォルト メソッドを、そのインターフェイスをサブクラス化するインターフェイスから呼び出すことはできますか?
Java 8では、次のようなものがあります:
匿名の内部クラスを作成してそれを呼び出すことなく、implementsB からデフォルトの機能インターフェイスの動作を呼び出す方法はありますか?
これには副作用があり (implementsA のメソッドを 2 回呼び出す)、必要な場合は親の実装への呼び出しが必要であり、必要に応じていくつかの特殊化と共に、子の実装で子の既定の実装を呼び出すことができます。ご覧のとおり、親の実装を呼び出すのは非常に簡単ですが、子インターフェイスを実装するクラスに間接レイヤーを追加しない限り、デフォルトの実装を書き直さないようにする方法がわかりません。また、それを強制する方法もありません。 .
たとえば、A がデータベースなどのリソースへのアクセスをロック解除または提供し、B が 2 番目のリソース (別のデータベース) のロックを解除した場合、コードで A をロック解除し、B が機能インターフェイスを使用してこのコントラクトを強制する方法がわかりません。 AとBが呼び出されます。 1 レベルの深さでは実行できますが、N レベルの深さでは不可能のようです。
私はラムダを使用して、コストのかかる呼び出しを回避し、ライブラリのユーザーに操作の意味的な順序を強制するつもりでした。
この質問は、「Java で既定のメソッドを明示的に呼び出す」とはまったく同じではありません。この質問は、親インターフェイスの既定のメソッドを呼び出すだけでなく、N レベルの深さのインターフェイスに関するものであるためです。
java - 「匹敵するべき」'機能的インターフェース'になる?
機能インターフェースの定義は、「機能インターフェースは、( Object のメソッドを除いて) 1 つの抽象メソッドのみを持つインターフェースであり、したがって単一の機能コントラクトを表す」です。
この定義によれば、Comparable<T>
は間違いなく機能的なインターフェースです。
ラムダ式の定義は、「ラムダ式はメソッドのようなものです。正式なパラメータのリストと、それらのパラメータで表現されたボディ (式またはブロック) を提供します。」
ラムダ式の評価により、関数型インターフェイスのインスタンスが生成されます。
したがって、ラムダ式の目的は、機能インターフェースの単一の関数を実装することによって、機能インターフェースのインスタンスを作成できるようにすることです。すなわち。単一の関数でインスタンスを作成できるようにします。
を見てみましょうComparable<T>
。このインターフェイスは、単一の機能として使用するように設計されていますか? すなわち。この単一の関数のみを使用してインスタンスを作成するように設計されていますか?
のドキュメントはComparable<T>
、「このインターフェイスは、それを実装する各クラスのオブジェクトに完全な順序付けを課します。この順序付けは、クラスの自然順序付けと呼ばれ、クラスの compareTo メソッドは、その自然比較メソッドと呼ばれます。」で始まります。
上記の文はComparable<T>
、 が単一の関数として使用されるように設計されていないことを明確に示していますが、この単一の関数を追加することにより、インスタンスの自然な順序付けを持つクラスによって実装されることを常に意図しています。
ラムダ式を使用して作成するように設計されていないことを意味するのはどれですか?
ポイントは、Comparable のみのオブジェクトはなく、実装されることを意図しているため、クラスの追加関数として使用されるということです。
では、ラムダ式の作成をComparable<T>
防止する Java 言語の方法はありますか? インターフェイスの設計者は、このインターフェイスがクラスによって実装されることを意図しており、ラムダ式を使用してこの単一のメソッドでインスタンスとして作成されることを意図していないと判断できますか?
インターフェイスがたまたま単一の抽象メソッドを持っているという理由だけで、それを関数型インターフェイスと見なすべきではありません。
おそらく、Java が NotFunctional のような注釈を提供する場合、このインターフェースがラムダ式の作成に使用されていないことをコンパイラーがチェックできます。
java-8 - 機能インターフェースの抽象メソッドを繰り返しオーバーライドしますか?
私はJava 8で機能的なインターフェースを持っています:
主に:
これを実行すると、次のようになります。
この機能はそのままでいいのでしょうか?それは意図されていますか?
オーバーライドが実装クラスで行われ、ある時点で実装が変更される場合、そのメソッドが呼び出されるすべての場所で動作が同じになり、一貫性が保たれます。しかし、例のようにラムダ式を使用して動作/実装を変更すると、その動作はフローの後半で次の変更まで有効になります。これは信頼性が低く、従うのが難しいと感じます。
編集: @assylias someInt() の動作がどのように変更されたかわかりません... someInt にパラメーターを追加し、次のコードを使用するとどうなりますか:
var が最終的な偶数である場合、それをクラスでどのように書き直しますか?