Fork me on GitHub

java8方法引用

何是方法引用

当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用(Lambda表达式的另一种表达形式)

格式

方法引用:使用操作符“::”将方法名和对象或类的名字分隔开来。有如下三种使用情况:

对象::实例方法

对象实例方法
对象::实例方法

/**
 * 对象实例方法
 * 对象::实例方法
 */
@Test
public void test1(){
    Consumer<String> con1 = (x) -> System.out.println(x);
    con1.accept("孟楠");

    Consumer<String> con2 = System.out::println;
    con2.accept("院长");

    PrintStream ps = System.out;
    Consumer<String> con3 = ps :: println;
    con3.accept("孟楠楠");
    Consumer<String> con4 = (x) -> ps.println(x);
    con4.accept("梦喃喃");
}
@Test
public void test2(){
    Employee emp = new Employee();
    //共给型函数
    Supplier<String> sup = () -> emp.getName();
    String name = sup.get();
    System.out.println(name);

    Supplier<Integer> sup2 =  emp::getAge;
    Integer age = sup2.get();
    System.out.println(age);
}

类::静态方法

 @Test
public void test3(){
    Comparator<Integer> comp = (x,y) -> Integer.compare(x,y);
    System.out.println(comp.compare(3,5));
    //使用类::静态方法
    Comparator<Integer> comp2 = Integer::compare;
    System.out.println(comp2.compare(6,5));
}

类::实例方法

/**
 * 类::实例方法名
 */
@Test
public void test4(){
    BiPredicate<String,String> bi = (x,y) -> x.equals(y);
    System.out.println(bi.test("aa","bb"));

    BiPredicate<String,String> bi2 = String::equals;
    System.out.println(bi.test("aa1","aa1"));
}

注意

1、实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致

2、当需要引用方法的第一个参数是调用对象,并且第二个参数是需要引用方法的第二个参数(或无参数)时:ClassName::methodName