方法引用
基于尚硅谷java8教程
1. 方法引用说明
如果lambda方法体中的需要实现的功能已经在其他方法中提供了实现,那么可以使用方法引用的方式引用已经写好的实现,不需要重复编写。
注意:
- 方法引用使用的唯一途径就是在lambda表达式中对已经实现的方法进行简写调用,不可以在lambda表达式外使用
2. 方法引用分类
方法引用的标准形式为: 类名:方法名
注意:
- 方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致
- 在使用方法引用时,不可以添加()
分类如下:
说明 | 示例 |
---|---|
引用静态方法 | ContainingClass::staticMethodName |
引用特定对象的实例方法 | containingObject::instanceMethodName |
引用某个类型任意对象的实例方法 | ContainingType::methodName |
引用构造方法 | ClassName::new |
3. 范例
package com.seven.jdk8;
import com.seven.pojo.Employee;
import org.junit.Test;
import java.util.Arrays;
import java.util.Comparator;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
public class MethodRefTest {
//引用静态方法
@Test
public void test1(){
//lambda表达式实现
Comparator<Integer> com = (x, y) -> Integer.compare(x,y);
//方法引用实现
Comparator<Integer> com2 = Integer::compare;
//调用
System.out.println(com.compare(1,2)+"|"+com2.compare(1,2));
}
//引用特定对象的实例方法
@Test
public void test2(){
Employee emp = new Employee(1,"张三",10000.23,35);
//lambda表达式实现
Supplier<String> sup1 = () -> emp.getName();
//方法引用实现
Supplier<String> sup2 = emp::getName;
//调用
System.out.println(sup1.get()+"||"+sup2.get());
}
//引用某个类型任意对象的实例方法
@Test
public void test3(){
String[] strArr1 = {"Zhangsan","Lisi"};
String[] strArr2 = {"Zhangsan","Lisi"};
//lambda表达式实现
Arrays.sort(strArr1,(s1,s2) -> s1.compareToIgnoreCase(s2));
//方法引用实现
Arrays.sort(strArr2,String::compareToIgnoreCase);
//调用
for(String str:strArr1){
System.out.println("strArr1-->"+str);
}
for(String str :strArr2){
System.out.println("strArr2-->"+str);
}
}
//引用构造方法
@Test
public void test4(){
/*使用无参构造器*/
//lambda表达式实现
Supplier<Employee> sup1 = ()->new Employee();
//方法引用实现
Supplier<Employee> sup2 = Employee::new;
//调用
System.out.println("sup1-->"+sup1.get());
System.out.println("sup2-->"+sup2.get());
/*使用有参构造器*/
//lambda表达式实现
Function<String,Employee> fun1 = (name) -> new Employee(name);
Employee e1 = fun1.apply("张三");
//方法引用实现
Function<String,Employee> fun2 = Employee::new;
Employee e2 = fun2.apply("李四");
//调用
System.out.println("fun1-->"+e1.toString());
System.out.println("fun2-->"+e2.toString());
}
}
//Employee.java
package com.seven.pojo;
public class Employee {
private int id;
private String name;
private double salary;
private int age;
public Employee(int id, String name, double salary, int age) {
this.id = id;
this.name = name;
this.salary = salary;
this.age = age;
}
public Employee(String name) {
this.name = name;
}
public Employee() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", salary=" + salary +
", age=" + age +
'}';
}
}
源代码地址:http://git.oschina.net/johnny/java_base