java8新特性之方法引用示例代码
简介
方法引用是java8的新特性之一,可以直接引用已有Java类或对象的方法或构造器。方法引用与lambda表达式结合使用,可以进一步简化代码。
方法引用的使用场景
我们用Lambda表达式来实现匿名方法。但有些情况下,我们用Lambda表达式仅仅是调用一些已经存在的方法,除了调用动作外,没有其他任何多余的动作,在这种情况下,我们倾向于通过方法名来调用它,而Lambda表达式可以帮助我们实现这一要求,它使得Lambda在调用那些已经拥有方法名的方法的代码更简洁、更容易理解。方法引用可以理解为Lambda表达式的另外一种表现形式。
方法引用的分类
| 类型 | 语法 | 对应的Lambda表达式 |
|---|---|---|
| 静态方法引用 | 类名::staticMethod | (args)->类名.staticMethod(args) |
| 实例方法引用 | inst::instMethod | (args)->inst.instMethod(args) |
| 对象方法引用 | 类名::instMethod | (inst,args)->类名.instMethod(args) |
| 构建方法引用 | 类名::new | (args)->new类名(args) |
示例代码:
importlombok.AllArgsConstructor;
importlombok.Data;
/**
*creategl
**/
@Data
@AllArgsConstructor
publicclassUser{
privateStringname;
privateIntegerage;
privateStringsex;
privateStatusstatus;
publicUser(Stringname){
this.name=name;
}
publicUser(){}
publicUser(Stringname,Integerage,Stringsex){
this.name=name;
this.age=age;
this.sex=sex;
}
publicenumStatus{
FREE,
BUSY,
VOCATION;
}
}
importcom.gl.java8test.User;
importjava.util.Comparator;
importjava.util.function.BiPredicate;
importjava.util.function.Consumer;
importjava.util.function.Function;
importjava.util.function.Supplier;
/**
*creategl
*
*一。方法引用:若lambda体中的内容有方法已经实现,我们可以使用”方法引用“
*
*主要有三种语法格式
*
*1.对象::实例方法名
*2.类::静态方法名
*3.类::实例方法名
*
*注意:方法体中的参数与返回类型必须与该函数接口中的参数返回类型保持一致
*第一个参数是实例的调用者,第二个参数是实例方法的参数时,可以这样写ClassName::method
*
*
*二。构造器引用
*格式:ClassName::new
*
*三.数组引用
*格式:Type[]::new
**/
publicclassTest03{
//对象::实例方法名
publicstaticvoidtest1(){
Consumerconsumer=System.out::println;
consumer.accept("631235");
System.out.println("----------------------------");
Useruser=newUser();
SupplierstringSupplier=user::getName;
stringSupplier.get();
}
//类::静态方法名
publicstaticvoidtest2(){
Comparatorcomparator=Integer::compare;
}
//类::实例方法名
publicstaticvoidtest3(){
BiPredicatebiP=(x,y)->x.equals(y);
//下面这样写必须是:第一个参数是实例的调用者,第二个参数是实例方法的参数时,可以这样写ClassName::method
BiPredicatebiPredicate=String::equals;
}
//构造器引用构造器的参数与返回类型必须与该函数接口中的参数返回类型保持一致
publicstaticvoidtest4(){
//SupplieruserSupplier=()->newUser();
SupplieruserSupplier=User::new;
Useruser=userSupplier.get();
System.out.println("----------------------------");
Functionfunction=User::new;
Useruser1=function.apply("sfsdf");
System.out.println(user1);
}
//数组引用
publicstaticvoidtest5(){
//Functionfunction=x->newString[x];
Functionfunction=String[]::new;
}
publicstaticvoidmain(String[]args){
//test1();
test4();
}
}
importcom.gl.java8test.User;
importjava.util.Comparator;
importjava.util.function.BiPredicate;
importjava.util.function.Consumer;
importjava.util.function.Function;
importjava.util.function.Supplier;
/**
*creategl
*
*一。方法引用:若lambda体中的内容有方法已经实现,我们可以使用”方法引用“
*
*主要有三种语法格式
*
*1.对象::实例方法名
*2.类::静态方法名
*3.类::实例方法名
*
*注意:方法体中的参数与返回类型必须与该函数接口中的参数返回类型保持一致
*第一个参数是实例的调用者,第二个参数是实例方法的参数时,可以这样写ClassName::method
*
*
*二。构造器引用
*格式:ClassName::new
*
*三.数组引用
*格式:Type[]::new
**/
publicclassTest03{
//对象::实例方法名
publicstaticvoidtest1(){
Consumerconsumer=System.out::println;
consumer.accept("631235");
System.out.println("----------------------------");
Useruser=newUser();
SupplierstringSupplier=user::getName;
stringSupplier.get();
}
//类::静态方法名
publicstaticvoidtest2(){
Comparatorcomparator=Integer::compare;
}
//类::实例方法名
publicstaticvoidtest3(){
BiPredicatebiP=(x,y)->x.equals(y);
//下面这样写必须是:第一个参数是实例的调用者,第二个参数是实例方法的参数时,可以这样写ClassName::method
BiPredicatebiPredicate=String::equals;
}
//构造器引用构造器的参数与返回类型必须与该函数接口中的参数返回类型保持一致
publicstaticvoidtest4(){
//SupplieruserSupplier=()->newUser();
SupplieruserSupplier=User::new;
Useruser=userSupplier.get();
System.out.println("----------------------------");
Functionfunction=User::new;
Useruser1=function.apply("sfsdf");
System.out.println(user1);
}
//数组引用
publicstaticvoidtest5(){
//Functionfunction=x->newString[x];
Functionfunction=String[]::new;
}
publicstaticvoidmain(String[]args){
//test1();
test4();
}
}
总结
到此这篇关于java8新特性之方法引用的文章就介绍到这了,更多相关java8新特性方法引用内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!