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
网友评论