嗨问题很简单。
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
之间有什么区别?
答案 0 :(得分:6)
String::startWith
将startWith()
方法应用于lambda的第一个参数。
""::startWith
将startWith()
方法应用于""
字面,或以更广泛的方式应用于未声明为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 |结果=真