2017-07-20 6 views

答えて

6

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

+0

です。どのようにデザイナーがその構文を使用するのがすばらしく混乱していますか?関係なく説明に感謝します。 –

+4

@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

+0

私にとって混乱を招くのは、静的メンバとインスタンスメンバを解決するために' :: 'を使用し、どちらの場合でも' .'を避けることです。 C++の観点からは、 '::'は静的メンバーを解決し、 '.'はインスタンスメンバーを解決します。 C#POVから、 '.'はどちらかを解決します。もちろん、C++やC#については言及していませんが、私の見解では奇妙な選択です。 –

関連する問題