Java8特性之方法引用

方法引用

掌握四种方法的引用使用。

 

具体内容

一直以来都只是在对象上能否发现引用的身影,而对象引用的特点:不同的对象可以操作同一块内容,方法引用就是指为一个方法设置别名,相当于一个方法定义了不同的名字。

方法引用在Java8之中一共定义了四种形式:

       ·引用静态方法:类名称 ::static 方法名称;

       ·引用某个对象的方法:实例化对象 :: 普通方法;

       ·引用特定类型的方法:特定类 :: 普通方法;

       ·引用构造方法: 类名称 ::new 。

示例:引用静态方法

·       在 String类里面有一个 valueOf() 方法: public static String valueOf (int x);

·       /**
 *
实现方法的引用接口
 * @param
<P> 引用方法的参数类型
 * @param
<R> 饮用方法的返回类型
 */
interface IMessage<P,R>{
   
publicR zhuanhuan(P p);
}
public class TestDemo{
   
publicstatic void main(String[]args) {
       
//即:将String.valueOf()方法变成了IMessage接口里的zhuanhuan()方法
       
IMessage<Integer,String> msg = String :: valueOf;
       
Stringstr = msg.zhuanhuan(1000);
       
System.out.println(str.replaceAll("0","9"));
   
}
}

示例:普通方法引用

 interface IMessage<R>{
    public R upper();
}
public class TestDemo{
    public static void main(String[] args) {
        // String类的toUpperCase() 定义public String toUpperCase()
        //这个方法没有参数,但是有返回值,并且这个方法一定要在有实例化的情况下才可以调用
        //"hello"这个字符串是String类的实例化对象,所以可以直接调用toUpperCase()方法
        //toUpperCase()函数的应用交给了IMessage接口
        IMessage<String> msg = "hello" :: toUpperCase;
        String str = msg.upper();   //相当于"hello".toUpperCase()方法
        System.out.println(str);
    }
}

·       通过两个代码演示应该已经发现了,如果要实现函数的引用,那么必须要有接口,而且最为关心的是,接口需要只存在一个方法。方法时无法进行引用的。

所以为了保证被引用接口里面只能够有一个方法,那么就需要增加一个注解的声明。

@FunctionalInterface    //此函数式接口,只能够定义一个方法

在进行方法引用的过程里面还有另外一种形式的引用(需要特定类的支持),正常情况下如果使用了“类 :: 方法”引用的一定是类中的静态方法,但是这种形式也可以引用普通方法。

例如:在String类中有一个方法:compareTo

       如果要比较的话,比较的形式:字符串1对象.compareTo(字符串2对象),也就是说如果真要引用这个方法就需要准备出两个参数。

示例:特定类型的引用

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("A","B"));
    }
}

       与之前相比,方法引用前不在需要定义对象,而是可以理解为将对象定义在了参数上。

示例:引用构造方法

 interface IMessage<C>{
    public C create (String t , double p );
}

class Book{
    private String title;
    private double price;
    public Book(String title, double price){
        this.title = title;
        this.price = price;
    }

    @Override
    public String toString() {
        return "书名:"+ this.title + ",价格:" + this.price;
    }
}

public class TestDemo{
    public static void main(String[] args) {
        IMessage<Book> msg = Book::new;
        //调用的虽然是create(),但是这个方法引用的事Book类的构造,事先了构造方法的引用
        Book book = msg.create("java开发",20.2);
        System.out.println(book);

    }
}

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

 

总结:

四种方法的引用基本的形式如上,但是是否去使用。不!

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值