本小节继续方法引用,即方法可以作为参数被传递,其与lambda联合使用 ,方法引用可以使语言的构造更加紧凑简洁,减少冗余代码。
1、方法引用的分类
- 构造器引用
Class::new对应lambda表达式:(args) -> new 类名(args) - 静态方法引用
Class::static_method对应lambda表达式:(args) -> 类名.static_method(args) - 对象方法引用
Class::method对应lambda表达式:(inst,args) -> 类名.method(args) - 实例方法引用
instance::method对应lambda表达式:(args) -> instance.method(args)
2、测试代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;
public class MethodReference {
public static void main(String[] args) {
//1构造器使用: Class::new
MethodReference mr = MethodReference.create(MethodReference::new);
//lambda表达式写法
MethodReference mr1 = MethodReference.create(()->new MethodReference());
List<MethodReference> list = Arrays.asList(mr);
//2静态方法引用 Class::static_method
list.forEach(MethodReference::test1);
//lambda表达式写法
list.forEach((methodReference)->MethodReference.test1(methodReference));
//3对象方法引用 Class::method
list.forEach(MethodReference::test3);
//4实例方法引用 instance::method
MethodReference mr2 = MethodReference.create(MethodReference::new);
list.forEach(mr2::test2);
//lambda表达式写法
list.forEach((methodReference)->mr2.test2(methodReference));
//另外,我们也可以将 System.out::println 方法作为静态方法来引用。
List<String> names = new ArrayList<String>();
names.add("java");
names.add("python");
names.add("cpp");
names.forEach(System.out::println);
}
public interface Student<T> {
T get();
}
public static MethodReference create(Supplier<MethodReference> call) {
return call.get();
}
public static void test1(MethodReference methodReference) {
System.out.println("test1");
}
public void test2(MethodReference methodReference) {
System.out.println("test2");
}
public void test3() {
System.out.println("test3");
}
}
以上就是jdk8中的方法引用。