答えて
String::startWith
は、ラムダの最初の引数にstartWith()
メソッドを適用します。
""::startWith
はリテラルまたはラムダ引数として宣言されていない変数へのより広範な方法で""
にstartWith()
方法を適用します。
さらに包括的にすると、メソッド参照を提供するこれらの2つの方法は代用可能ではありません。
public boolean startsWith(String prefix)
メソッドのメソッドリファレンスを使用するとします。
メソッドがオーバーロードされているので、それを指定します。
ラムダパラメータを使用してメソッド参照は、メソッド参照がPredicate<String>
機能インターフェイスで動作するように設計されたラムダパラメータで宣言されていない変数を使用しながら、BiPredicate<String, String>
機能インタフェースで動作するように設計されています。
メソッド参照の対象として渡された変数と方法:
String myVariable; myVariable::startWith
既に方法基準を適用すべきで文字列を提供します。ここに:myVariable
。
したがって、ラムダで渡す必要があるのはprefixパラメータだけです。
従ってPredicate<String>
スーツ。
方法基準の対象とラムダパラメータの最初の引数を用いた方法:
String::startsWith
メソッド参照がべきで文字列を提供しません適用されます。
したがって、メソッドを呼び出すべきStringと接頭引数の両方をラムダで渡す必要があります。
従ってBiPredicate<String, String>
スーツ。ここで
は説明するために、サンプルコードです:この出力生成
public static void main(String[] args) {
// using method reference with lambda parameter
myMethodWithBiPredicate((s, prefix) -> s.startsWith(prefix), "mystring", "my");
myMethodWithBiPredicate(String::startsWith, "mystring", "my");
// using method reference with variable not in lambda parameter
String stringNotInLambdaParams = "stringNotInParam";
Predicate<String> functionPredicate = stringNotInLambdaParams::startsWith;
System.out.print("myMethodWithBiPredicate with string "
+ "(included in the method reference)="
+ stringNotInLambdaParams
+ " and prefix= string | Result = ");
myMethodWithPredicate(functionPredicate, "string");
}
public static void myMethodWithBiPredicate(BiPredicate<String, String> function,
String string,
String prefix) {
System.out.println("myMethodWithBiPredicate with string="
+ string + " and prefix= " + prefix
+ " | Result = " + function.test(string, prefix));
}
public static void myMethodWithPredicate(Predicate<String> function, String prefix) {
System.out.println(function.test(prefix));
}
:文字列=列MyStringと接頭辞を持つ
myMethodWithBiPredicateを=私|結果 = true
myMethodWithBiPredicate with string = mystring and prefix = my |結果結果 = true
(メソッド の参照に含まれる)文字列を含むmyMethodWithPredicate = stringNotInParamおよびprefix = string |結果= true
です。どのようにデザイナーがその構文を使用するのがすばらしく混乱していますか?関係なく説明に感謝します。 –
@Aluan Haddad:私はここで混乱するものは見当たりません。 'object :: method'は' object'に対して 'method'を呼び出します。 'Class :: method'はオブジェクトを持たないので、' method'が 'static'でない場合、ターゲットオブジェクトは最初の関数パラメータになります。つまり、 'String :: startsWith'は'(a、b) - > a.startsWith(b) 'に相当し、' 'startsWith''は' b - > "" .startsWith(b) '(これは' b - > b.isEmpty() 'に相当します) – Holger
私にとって混乱を招くのは、静的メンバとインスタンスメンバを解決するために' :: 'を使用し、どちらの場合でも' .'を避けることです。 C++の観点からは、 '::'は静的メンバーを解決し、 '.'はインスタンスメンバーを解決します。 C#POVから、 '.'はどちらかを解決します。もちろん、C++やC#については言及していませんが、私の見解では奇妙な選択です。 –
- 1. インタフェースへのJavaメソッドリファレンスの割り当て
- 2. Julia:配列の割り当て動作
- 3. Datamapperの割り当て動作
- 4. TFSバグ再割り当ての動作
- 5. 自動割り当てオペレータの作成
- 6. C++の動的割り当てメモリ内での動的メモリ割り当て
- 7. 静的割り当てと動的割り当てとの比較自動割り当て
- 8. C++のデフォルトの割り当て動作は何ですか?
- 9. 動的割り当て
- 10. 動的割り当てstucks
- 11. オブジェクト割り当ての動作が混乱する
- 12. Cでの動的メモリ割り当て
- 13. Cでの動的割り当てエラー
- 14. オブジェクトの割り当てとJavaでのGCの動作
- 15. ツリーアルゴリズムにおけるメモリの動的割り当てと再割り当て
- 16. Matlab並列コンピューティングツールボックス、パーフォルループでの作業の動的割り当て
- 17. JavaScriptでの文字列の割り当て動作
- 18. xcode/swiftで値の割り当てを割り当てます。
- 19. 配列の割り当てにおけるコンパイラの動作
- 20. 作業項目を「未割り当て」に割り当てる方法は?
- 21. メモリの割り当て/割り当て解除(WindowsではC++)
- 22. 割り当てられたアドレスで構造をインスタンス化する(割り当て割り当て)
- 23. C:スキャン中の動的割り当て
- 24. KVMの動的メモリ割り当て
- 25. 動的割り当て構造のスワップ
- 26. 配列の動的割り当て
- 27. kshの動的割り当て
- 28. 操作後のオブジェクトの割り当て
- 29. RSpecコントローラのテスト - 予期せぬ動作の「割り当て」
- 30. Pythonの割り当てとその動作
私はあなたの直前のコメントにあなたの前の質問で同じことを尋ねるコメントに答えました。 – Eran
私の答えは見つかりました。私の答えは –