方法引用

方法引用:指为一个方法设置别名,相当于一个方法定义了不同的名字。

四种方法引用:

  • 引用静态方法:类名称::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);
    }
}

对象的引用是使用不同的名字,而方法引用是需要有一个函数式接口,并且要设置好参数。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值