問題タブ [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 - 機能インターフェースのリファクタリングをサポートするアノテーション
次の例を検討してください。
機能インターフェースGreeter
には 2 つの実装があります。句を使用してExplicitGreeterImpl
実装しますが、それなしで実装します。それにもかかわらず、はと同様に を実装するように設計されています。Greeter
implements
ImplicitGreeterImpl::doTheGreeting
Greeter
ImplicitGreeterImpl::doTheGreeting
Greeter
ExplicitGreeterImpl
Greeter
ここで、インターフェイスをリファクタリングしたいので、名前を渡すことができます。
これは、Eclipse が提供するChange Method Signatureリファクタリングを使用して行うことができます(他の IDE にも同様のリファクタリングがあると確信しています)。これにより、インターフェイスのすべての実装と使用法が自動的に更新されGreeter
ます。実装は新しいパラメーターを受け取りますが、用途は構成可能なデフォルト値を渡します。これは では問題なく機能しますが、リファクタリングはメソッドExplicitGreeterImpl
に影響しません。ImplicitGreeterImpl::doTheGreeting
したがって、割り当て
コンパイル時エラーになります。これを修正するには、メソッドの署名を手動で調整する必要がありますImplicitGreeterImpl::doTheGreeting
。
多くの場合、 の署名を自動的に調整することは望ましくないことを理解しましたImplicitGreeterImpl::doTheGreeting
。ただし、現在のワークフローは改善できると感じています。
- Eclipse は、リファクタリング プレビューに、コンパイル時にエラーが発生することを示唆する警告を表示しません。
- メソッドに注釈を付けて、特定の機能インターフェイスを実装することになっていることを明確にすることができるはずです。
たとえば、次のImplicitGreeterImpl
ようになります。
現在、リファクタリング ツールはImplicitGreeterImpl::doTheGreeting
、実装が想定されていることを確認Greeter
できるため、署名を自動的に変更できます。
したがって、私の質問は次のとおりです。特定のメソッドが特定の機能インターフェイスを実装することになっていることをリファクタリングツールに伝える方法はありますか? 上記で提案された注釈を検索しましたが、有用なものは見つかりませんでした。
java - 関数から compose() または andThen() を使用するときにオブジェクトを返す
関数インターフェース Function の compose() および andThen() メソッドをテストするために、単純なコードを作成しました。
しかし、ご覧のとおり、このコードはコンパイルされません。与えられた理由: タイプ variable(v) V のインスタンスが存在しないため、Function は Trans に準拠します。
ワイルドカードの extends と super の違いについて複数の主題をたどると、リストでそれらを使用することは理解できますが、ここでコンパイルできない理由はよくわかりません。
メソッド testCompose() でオブジェクト Trans を返し続ける方法はありますか、それともコードをコンパイルさせるために必ず関数を返す必要がありますか?
java - 内部列挙型の戦略パターン
コードから大きな switch ステートメントを取り除こうとしていますが、既存の列挙型に基づく戦略パターンがいいと思いました。コンセプトは次のようなものです。
だから私はそれを次のように使うことができます:
Option.Option1.setMethodToExecute(this::action1);
しかし、列挙型にはますます多くのオプションがあり、列挙型の中にすべてを入れたいので、この部分は好きではありません。完璧なのは次のようなものです。
しかし、enum は静的であり、MyStrategy.this で囲んでいるインスタンスにアクセスできないため、これは不可能です。オプションのセットがあり、values() や valueOf() などのメソッドを使用すると便利なため、enum が必要ですが、スイッチを大きくする代わりに 1 行で呼び出す必要があります。このような何かを達成する方法はありますか、またはこの列挙型コンストラクターの呼び出しを可能にする回避策はありますOption1(MyStrategy.this::action1)
か?
java - raw タイプ 'my.lambda.closure' のメンバーとしての 'lambda(T, T)' へのチェックされていない呼び出し
Labdas を実践している間Lambda
、メソッドから sを渡していmain
ます。問題なく実行されますが、atIntelliJ
という警告が表示されます。ここで何が欠けていますか?Unchecked call to 'lambda(T, T)' as a member of raw type 'my.lambda.closure'
line 18
java - Java 8 で Supplier を使用する必要があるのはいつですか?
このコードの違いは何ですか?
Java 8 で関数型インターフェースの学習を開始しましたが、サプライヤの利点がわかりません。いつ、どのように、正確に、それらを使用する必要があります。サプライヤはパフォーマンスを向上させますか、それとも抽象化レベルでのメリットをもたらしますか?
回答ありがとうございます。また、検索を使用して必要なものが見つからなかったため、重複した質問ではありません。
更新 1: これのことですか?
java - オブジェクトのみが許可されている場合、パラメータとして関数を渡します。外部ライブラリのように
オブジェクトをパラメータとしてのみ受け入れる外部ライブラリに対処する必要があります。次のようなメソッド シグネチャ:ExternalObj.setValue(Object object)
私の質問は、なぜ以下の愚かなWrapperが必要なのですか?
ランバを直接使用できないのはなぜですか?
java - 機能インターフェース
私は Functional Interface の初心者で、今日はいくつかのチュートリアル サイトから学んでいます。質問があります。あなたの提案を提供し、私を導いてください。
以下のコードに質問があります。
オブジェクト クラスは、すべての Java クラスの親です。ここでwait()メソッドは、これが最終的なものであるため、オーバーライドされていないと言っています。したがって、Demo インターフェイスも Object クラスの子であることを意味します (一般的に言えば)。
質問:オブジェクト clone(); のときにコードが機能するようになりました。メソッドはコメントされていません。つまり、このメソッドはインターフェイス Demo で宣言されています。しかし、その実装をクリックすると、Object クラスの clone() メソッドに移動します。
clone() メソッドをコメントし、equals() メソッドのコメントを外すと、コンパイル時エラーが発生します。インターフェイスは FunctionalInterface ではありません。どうして ??????なぜ clone() メソッドとの機能的なインターフェースなのか。
clone() が保護されているとは言わないでください。クローンが Object クラスで保護されている場合はどうなりますか。説明してください。
ありがとう、澤井
java - Stream::reduce のアキュムレータが BiFunction であり、コンバイナのような BinaryOperator ではないのはなぜですか?
Stream::reduce
メソッドの accumulator 引数がa であり、combiner 引数のようなaBiFunction
ではないのはなぜですか。BinaryOperator
なぜその型は BiFunction<U, ? super T, U>
? なぜT
ですか?それはすべきBiFunction<U, ? extends U, U>
ですか?
java - 単一のメソッド インターフェイスに @FunctionalInterface のタグを付ける必要があるのはなぜですか?
SonarQube は、Squid:S1909 @FunctionalInterface アノテーションを使用して、Single Abstract Method インターフェイスの警告にフラグを立てる必要があります。
解説もたいしたものではありません。既存のラムダ式を壊すことについて言及していますが、インターフェイスに新しいメソッドを追加して既存のラムダを壊すと、コンパイラはすでにキャッチしませんか? 注釈は主に意図を明らかにすることに関するものですか?
コードがラムダ式で使用されていない場合 (ラムダ式で一部のインターフェイスのみが使用されている従来のコード ベースからのものではないため) --- を追加する意味はあります@FunctionalInterface
か?
java-8 - メソッドのオーバーライドと機能インターフェイスのコンパイル エラー
@FunctionalInterface
Java 8 (Eclipse)の使用中に発生したエラーを再現しました。以下はコンパイルされません。Refined
エラーが発生します:
Refined
のすべてを拡張すると、Function
エラーが発生します。これらのいずれかを削除すると、コードがコンパイルされます。これは正しい動作ですか?もしそうなら、どのようにリファクタリングできますか/すべきですか?Receiver
Giver
アップデート
これは同様のエラーを生成するようです:
@FunctionalInterface
また、すべてがコンパイルされていないことに注意してください。インターフェイス インスタンスをラムダとして表現することはできません。