实例方法和类方法
引用实例方法
自动把调用方法的时候的参数,全部传给引用的方法
<函数式接口> <变量名> = <实例>::<实例方法名>;
// 自动把[实参]全部传递给引用的实例方法
<变量名>.<接口方法名>([实参]);
引用类方法
全部参数传递给引用的方法
<函数式接口> <变量名> = <类>::<类方法名>;
// 自动把[实参]全部传递给引用的类方法
<变量名>.<接口方法名>([实参]);
引用实例方法和类方法的实例Demo
package market.daoge.recode.java8;
import java.util.Arrays;
public interface MethodRef {
void test(String s);
}
interface MethodRef1 {
void test(int[] arr);
}
class TestMethodRef {
public static void main(String[] args) {
MethodRef r = (s) -> System.out.println(s);
r.test("字符串的");
// 使用方法的引用:实例方法的应用
// System.out是一个实例
MethodRef r1 = System.out::println;
r1.test("方法引用");
// 能够根据函数式接口的方法参数,推断应用的方法的参数的数据类型
// 不引用方法进行排序
MethodRef1 r3 = (o) -> Arrays.sort(o);
//引用类方法
MethodRef1 r2 = Arrays::sort;
int[] a = new int[]{4,3,5,34,23};
// 以后用方法排序
r2.test(a);
// 引用方法输出
r1.test(Arrays.toString(a));
}
}
类的实例方法
引用类的实例方法
定义,调用接口方法的时候,需要多一个参数,并且参数的类型和引用实例方法的类型必须一致,把第一个参数作为引用的实例,后面的每一个参数全部传递给引用的方法。
interface <函数式接口> {
<返回值> <方法名>(<类型><名称>[,其他的参数…]);
}
<函数式接口> <变量名> = <类>::<实例方法名>;
<变量名>.<方法名>(<类名的实例>[,其他参数]);
引用类的实例方法的实例Demo
interface MethodRef2 {
void test(PrintStream out, String str);
}
class TestMethodRef {
public static void main(String[] args) {
// 引用类的实例方法
MethodRef2 r4 = PrintStream::println;
// 第二个之后的参数,作为引用到的方法的参数
r4.test(System.out,"第二个参数");
}
}
构造器引用
构造器引用
把方法的所有参数全部传递给引用的构造器,根据参数的类型推断调用的构造器。
<类名>::new
构造器引用实例Demo
interface MethodRef4 {
String test(char[] cs);
}
class TestMethodRef {
public static void main(String[] args) {
// 引用构造器,根据函数式接口的方法名来判断应用哪一个构造器
MethodRef4 r4 = String::new;
String ok = r4.test(new char[]{'道','哥'});
System.out.println(ok);
// 不用构造器引用的写法
MethodRef4 r5 = (c) -> {
return new String(c);
};
r5.test(new char[]{'道','哥'});
}
}