/**
* 方法引用和构造器引用
* 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("十大","十大"));
}
}