在lamdas中工作的方法参考分配

时间:2017-07-20 12:15:37

标签: java java-8

嗨问题很简单。

with table_a ( org_1, org_2 ) as ( select '01', '02' from dual union all select '02', '03' from dual union all select '02', '04' from dual union all select '05', '06' from dual ) -- End of simulated input data (for testing purposes only). -- Solution (SQL query) begins BELOW THIS LINE. select dense_rank() over (order by connect_by_root(org_1)) as chain, org_1, org_2, connect_by_root(org_1) as highest_parent_in_chain from table_a connect by org_1 = prior org_2 start with org_1 in ( select org_1 from table_a a where not exists (select * from table_a where org_2 = a.org_1) ) ; CHAIN ORG_1 ORG_2 HIGHEST_PARENT_IN_CHAIN ----- ----- ----- ----------------------- 1 01 02 01 1 02 03 01 1 02 04 01 2 05 06 05 String::startWith 之间有什么区别?

1 个答案:

答案 0 :(得分:6)

String::startWithstartWith()方法应用于lambda的第一个参数。

""::startWithstartWith()方法应用于""字面,或以更广泛的方式应用于未声明为lambda参数的变量。

更详尽一点,提供方法参考的这两种方式不可替代。

假设您要使用public boolean startsWith(String prefix)方法的方法参考。
我指定它,因为方法过载。

使用lambda参数的方法引用旨在使用BiPredicate<String, String>功能接口,而使用未在lambda参数中声明的变量的方法引用设计为与Predicate<String>功能接口一起使用。

  • 将变量作为方法引用的目标传递的方式:

    String myVariable; myVariable::startWith

已经提供了应该应用方法引用的String。这里:myVariable
因此,只需要在lambda中传递前缀参数 所以Predicate<String>适合。

  • 使用lambda参数的第一个参数作为方法引用的目标的方法:

    String::startsWith

不提供应该应用方法引用的String。
因此,应该调用方法的String和前缀参数都需要在lambda中传递 所以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));
}
产生此输出的

  

myMethodWithBiPredicate with string = mystring和prefix = my |结果   = true

     

myMethodWithBiPredicate with string = mystring和prefix = my |结果   = true

     

myMethodWithPredicate with string(包含在方法中)   reference)= stringNotInParam和prefix = string |结果=真