方法引用:指为一个方法设置别名,相当于一个方法定义了不同的名字。
四种方法引用:
- 引用静态方法:类名称::static 方法名称;
- 引用某个对象的方法:实例化对象::普通方法;
- 引用特定类型的方法:特定类::普通方法;
- 引用构造方法:类名称::new;
1、引用静态方法
- 在String类里面有一个valueOf()方法: public static String valueOf(int x);
/**
* 实现方法的引用接口
* @param <P> 引用方法的参数类型
* @param <R> 引用方法的返回类型
*/
public interface IMessage<P,R> {
public R zhuanhuan(P p);
}
public class TestDemo {
public static void main(String[] args) {
//即:将String.valueOf()方法变为了IMessage 接口里的zhuanhuan()方法
IMessage<Integer,String> msg=String::valueOf;
String str=msg.zhuanhuan(10000);
System.out.println(str);
}
}
例2:自定义静态方法
public interface StringFunc{
String func(String n);
}
public class MyStringOpt {
public static String strReverse(String str){
StringBuffer sb=new StringBuffer("");
for(int i=str.length();i>=0;i--){
sb.append(str.charAt(i));
}
return sb.toString();
}
}
public class MethodRef {
public static String stringOpt(StringFunc func,String s){
return func.func(s);
}
public static void main(String[] args) {
String str="i have a dream to impl java";
//MyStringOpt::strReverse 相当于实现了接口方法func()
//并在接口方法中func中做了MyStringOpt.strReverse操作
String optStr=stringOpt(MyStringOpt::strReverse,str);
System.out.println("optStr:"+optStr);
}
}
2、引用普通方法
public class MethodRef {
public static void main(String[] args) {
String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray,String::compareToIgnoreCase);
for(String s:stringArray){
System.out.print(s+" ");
}
}
}
例2:
public interface StringFunc{
String func(String n);
}
public class MyStringOpt {
public String strReverse(String str){
StringBuffer sb=new StringBuffer("");
for(int i=str.length()-1;i>=0;i--){
sb.append(str.charAt(i));
}
return sb.toString();
}
}
public class MethodRef {
public String stringOpt(StringFunc func,String s){
return func.func(s);
}
public static void main(String[] args) {
String str="i have a dream";
MyStringOpt opt=new MyStringOpt();
//普通方法必须创建对象
StringFunc fun=opt::strReverse;
System.out.println(fun.func(str));
}
}
StringFunc接口中只能有一个方法。
3、特定类:普通方法
@FunctionalInterface //此为函数式接口,只能够定义一个方法。
public interface IMessage<P> {
public int compare(P p1,P p2);
}
public class TestDemo {
public static void main(String[] args) {
IMessage<String> msg=String::compareTo;
System.out.println(msg.compare("abc","adc"));
}
}
与之前相比,方法引用前不再需要定义对象,而是可以理解为将对象定义在了参数上
4、引用构造方法
@FunctionalInterface //此为函数式接口,只能够定义一个方法。
public interface IMessage<C> {
public C create(String t ,double p);
}
public class TestDemo {
public static void main(String[] args) {
IMessage<Book> msg=Book::new;
Book book=msg.create("java",22.22);
System.out.println(book);
}
}
对象的引用是使用不同的名字,而方法引用是需要有一个函数式接口,并且要设置好参数。