/**
* 方法引用和構造器引用
* 1.使用情景:當要傳遞給lambda體的操作,已經有方法實現了,就可以使用方法引用;
* 2.方法引用:本質上就是Lambda表達式,而lambda表達式作爲函數式接口的實例,所以
* 方法引用,也就是函數式接口的實例;
* 3.使用格式:類(或對象) :: 方法名
* 4.具體分爲如下三種情況:
* 情況一: 對象:: 非靜態方法
* 類 :: 靜態方法
*
* 情況二:類 :: 非靜態方法(有難度)
* 5.方法引用使用的要求,要求接口中的抽象方法的形參列表和返回值類型與方法引用的方法的
* 形參列表和返回值類型相同!(只針對情況一,不適用於情況二)
*/
public class MethodReferences {
/**
* 情況一:對象:: 非靜態方法
* Consumer 中的void accept(T t)
* PrintStream 中的void println(T t)
*/
@Test
public void text(){
Consumer<String> consumer=str -> System.out.println(str);
consumer.accept("橋邊姑娘");
System.out.println("**************************");
PrintStream ps=System.out;
Consumer<String> cns=ps :: println;
cns.accept("你的芬芳");
}
/**
* 情況一:類 :: 靜態方法
* Comparator中的 int compare(T t1,T t2)
* Integer中的 int compare(T t1,T t2)
*
*/
@Test
public void test2(){
Comparator<Integer> com=(t1,t2)-> Integer.compare(t1,t2);
System.out.println(com.compare(11,12));
System.out.println("*************************");
Comparator<Integer> com2=Integer::compareTo;
System.out.println(com2.compare(1111111,12));
}
/**
* 情況二:類 :: 非靜態方法(有難度)
* Comparator中的 int compare(T t1,T t2)
* String中的 int t1.compareTo(t2)
*
*/
@Test
public void text3(){
Comparator<String> com=(t1,t2)-> t1.compareTo(t2);
System.out.println(com.compare("t1","t2"));
System.out.println("**************************");
Comparator<String> com2=String::compareTo;
System.out.println(com2.compare("t1","t2"));
}
/**
* 情況二:類 :: 非靜態方法(有難度)
* BiPredicate中的 boolean test(T t1,T t2)
* String中的 boolean t1.equals(t2)
*
*/
@Test
public void text4(){
BiPredicate<String,String> bip=(t1,t2)->t1.equals(t2);
System.out.println(bip.test("十大","asd"));
System.out.println("**************************");
BiPredicate<String,String> bip2=String::equals;
System.out.println(bip2.test("十大","十大"));
}
}