美文网首页
JDK1.8之方法引用(方法别名/函数式接口声明/Spring分

JDK1.8之方法引用(方法别名/函数式接口声明/Spring分

作者: 秋笙fine | 来源:发表于2019-01-14 16:41 被阅读0次
image.png

1.四种方法引用

这里区别于对象引用:对象引用是不同的对象可以操作同一块内容
而方法引用就是指为一个方法设置别名,相当于一个方法定义了不同的名字。

方法引用的四种形式:

1.引用静态方法:类名称::static 方法名称
2.引用某个对象的方法:实例化对象::普通方法
3.引用特定类型的方法:特定类::普通方法
4.引用构造方法:类名称::new(DAO模式实现的基础)

范例:引用静态方法
在String类里面有一个valueOf()方法:public static String valueOf(int x)

package TestDemo;
/**
 * 实现方法的引用接口
 * @param <P> 引用方法的参数类型
 * @param <R> 引用方法的返回类型
 */
interface IMessage<P,R>{
    public R exchange(P p);
}

public class TestDemo{
    
    public static void main(String[] args) {
        //即:将String.valueOf()方法变味了IMessage接口里面的exchange()方法
        IMessage<Integer,String> msg=String::valueOf;
        String str=msg.exchange(1000);
        System.out.println(str.replace("0", "9"));
    }
}

将String.valueOf()方法变为了IMessage接口里面的exchange()方法

结果:


image.png

范例:实例化对象的普通方法引用

package TestDemo;
/**
 * 实现方法的引用接口
 * @param <R> 引用方法的返回类型
 */
interface IMessage<R>{
    public R upper();
}

public class TestDemo{
    
    public static void main(String[] args) {
        //即:String类的toUpperCase方法定义:public String toUpperCase()
        //这个方法没有参数,有返回值,无static修饰,需要实例化String对象才可以引用这个方法
        //"hello"是一个String类实例化对象,可以调用toUpperCase()方法,将此函数的引用交给IMessage接口的upper方法
        IMessage<String> msg="hello"::toUpperCase;
        String str=msg.upper();
        System.out.println(str);
    }
}

结果:


image.png

通过以上例子我们发现,要实现方法引用,那么必须要有接口,接口里面只能由一个方法,要实现接口中只有一个方法,那么就需要增加一个注解的声明。@functionalInterface(函数式接口声明)

/**
 * 实现方法的引用接口
 * @param <R> 引用方法的返回类型
 */
@FunctionalInterface
interface IMessage<R>{
    public R upper();
}

在进行方法引用的过程里面,还有
3.另一种形式的引用(需要特定类的对象支持)
例如:String类的compareTo
public int compareTo(String anotherString)
比较形式:字符串1对象.compareTo(字符串2对象),也就是说如果真要引用这个方法,要准备两个参数

package TestDemo;
/**
 * 
 * @param P 比较的两对象
 */
@FunctionalInterface
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"));
    }
}

结果A的ASCII码小于B,所以为-1
与之前相比,方法引用前不再需要定义对象,二十可以理解为将方法定义在了参数上。

范例:引用构造方法(Spring中DAO分层实现基础)

package TestDemo;
/**
 * 
 * @param P 比较的两对象
 */
@FunctionalInterface
interface IMessage<C>{
    public C create(String title,double price);
}
class Book{
    private String title;
    private double price;
    public Book(String title,double price){
        this.price=price;
        this.title=title;
    } 
    @Override
    public String toString() {
        return "Book:"+this.title+"Price:" + this.price;
    }
}
public class TestDemo{
    
    public static void main(String[] args) {
        
        IMessage<Book> msg=Book::new;//引用Book类的构造方法
        //调用的虽然是create。但是这个方法引用的是Book类的构造
        Book book=msg.create("Java Developer", 20.2);//这里是不是很像Impl的实现呢
        System.out.println(book);
    }
}

结果:


image.png

相关文章

  • JDK1.8之方法引用(方法别名/函数式接口声明/Spring分

    1.四种方法引用 这里区别于对象引用:对象引用是不同的对象可以操作同一块内容而方法引用就是指为一个方法设置别名,相...

  • JDK1.8 新特性

    JDK1.8 新特性 Lambda表达式函数式接口*方法引用和构造器调用Stream API接口中的默认方法和静态...

  • JDK1.8之内建函数式接口(方法引用的实现)

    观察在JDK1.8之中提供的新的函数式接口包以及提供的四个函数式接口。 方法引用都需要定义一个函数式接口,可是不管...

  • Lambda浅解

    lambda常见语法格式 无参,无返回值 有返回值 方法引用 函数式接口 函数式接口只包含一个抽象方法声明接口。使...

  • Java8(JDK1.8)新特性

    一、Java8(JDK1.8)新特性 1、Lamdba表达式 2、函数式接口 3、方法引用和构造引用 4、Stre...

  • JDK1.8新特性(超详细)

    Java函数式设计 实现方法: @FunctionalInterface接口 Lambda语法 方法引用 接口de...

  • JDK1.8特性之Release Notes

    JDK1.8主要更新如下内容: 1. Lambda 表达式 2. 函数式接口 3. 方法引用与构造器引用 4. S...

  • JDK1.8新特性

    JDK1.8新特性 1. 函数式接口 含义:有且仅有一个抽象方法,但可以有多个非抽象方法的接口 函数式接口,就是J...

  • java基础知识(五)

    函数式接口代表只包含一个抽象方法的接口。函数式接口可以包含多个默认方法、类方法,但只能声明一个抽象方法。 强制系统...

  • JAVA1.8新特性-函数式接口

    JDK1.8中引入了用于函数式编程的支持。java中的函数式接口指:有且只有一个方法的接口。函数式接口是适用于函数...

网友评论

      本文标题:JDK1.8之方法引用(方法别名/函数式接口声明/Spring分

      本文链接:https://www.haomeiwen.com/subject/zytjdqtx.html