在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理Java知识点的第三十三篇博客。
本篇博客介绍了Java的方法引用。
本系列博客所有Java代码都使用IntelliJ IDEA编译运行,版本为2022.1。所用JDK版本为JDK11。
目录
方法引用
体验方法引用
public interface quoteinterface {
public void showstring(String s);
}
这是quoteinterface接口,有抽象方法showstring,接受一个String类型s。
public class usequote {
public static void main(String[] args){
test((String s) -> {
System.out.println(s);
});
test(System.out::println);
}
public static void test(quoteinterface qi){
qi.showstring("Hello quote");
}
}
test函数接收一个quoteinterface的实现类qi,并调用其showstring方法。在main方法内用了Lambda表达式和方法引用。
程序的输出是:
Hello quote
Hello quote
::为引用运算符,所在表达式为方法引用。
Lambda表达式支持的方法引用
常见的引用方式有引用类方法,引用对象的实例方法,引用类的实例方法,引用构造器。
引用类方法
引用类方法就是引用类的静态方法。格式是:
类名::静态方法
Lambda表达式被类方法替代的时候,形式参数全部传递给静态方法作为参数。
public interface quoteinterface1 {
public int tran(String s);
}
quoteinterface1接口的tran抽象方法接受一个String类参数s,返回一个int值。
public class quote1 {
public static void main(String[] args){
quotetest((String s) -> {
return Integer.parseInt(s);
});
quotetest(Integer::parseInt);
}
public static void quotetest(quoteinterface1 qi){
int num = qi.tran("10");
System.out.println(num);
}
}
Integer类的静态方法public static int parseInt(String s)将s转换为int类型数据。
quotetest方法接受一个quoteinterface1的实现类对象qi,并执行其tran方法,输出结果。main方法使用Lambda表达式和引用类方法。
程序的输出是:
10
10
引用对象的实例方法
引用对象的实例方法就是引用类中的成员方法。格式是:
对象::成员方法
public interface quoteinterface2 {
public void tran(String s);
}
这是quoteinterface2接口,有成员方法tran,接受一个String类型变量s,无返回值。
public class quoteonetwo {
public void transtring(String s){
s = s.toUpperCase();
System.out.println(s);
}
}
这是quoteonetwo类,transtring方法接受一个String类型变量,将所有字符转换成大写后输出。
String类的方法public String toUpperCase()将此String的所有字符转化为大写。
public class quote2 {
public static void main(String[] args){
test((String s) ->{
s = s.toUpperCase();
System.out.println(s);
});
quoteonetwo qot = new quoteonetwo();
test(qot::transtring);
}
public static void test(quoteinterface2 qi){
qi.tran("Helloworld");
}
}
test类接受一个quoteinterface2的实现类qi,并执行tran方法。main方法通过Lambda表达式和引用对象的实例化方法实现。
程序的输出是:
HELLOWORLD
HELLOWORLD
引用类的实例方法
引用类的实例方法,就是引用类中的成员方法,格式是:
类名::成员方法
Lambda表达式被类的实例方法替代的时候,第一个参数作为调用者,其余参数传递给该方法作为参数。
public interface quoteinterface3 {
public String trans(String s,int a,int b);
}
quoteinterface3接口的trans方法接受一个String字符串s,和两个int类型变量a b,返回一个String字符串。
public class quote3 {
public static void main(String[] args){
test((String s,int a,int b)->{
return s.substring(a,b);
});
test(String::substring);
}
public static void test(quoteinterface3 qi){
String s = qi.trans("use quote",2,5);
System.out.println(s);
}
}
String类的方法public String substring(int beginIndex,int endIndex)将从beginIndex开始,到endIndex结束的内容截取并返回,长度为endIndex-beginIndex。
test方法接受一个quoteinterface3的实现类,调用其trans方法,输出结果。main方法通过Lambda表达式和引用类的实例化方法实现。
程序的输出是:
e q
e q
引用构造器
引用构造器就是引用构造方法,格式是:
类名::new
Lambda表达式被构造器替代的时候,它的形式参数全部传递给构造器作为参数。
public class student {
private String name;
private int age;
public student(){}
public student(String name,int age){
this.name = name;
this.age = age;
}
public String getname(){
return name;
}
public void setname(String name){
this.name = name;
}
public int getage(){
return age;
}
public void setage(int age){
this.age = age;
}
public String toString(){
return "the name is " + name + " and the age is " + age;
}
}
这是一个学生类,有String类型变量name和int类型变量age。
public interface quoteinterface4 {
public student make(String s,int i);
}
这是quoteinterface4接口,make抽象方法接受一个String类型参数和一个int类型参数,返回一个student类对象。
public class quote4 {
public static void main(String[] args){
test((String s,int i)->{
student stu = new student(s,i);
return stu;
});
test(student::new);
}
public static void test(quoteinterface4 qi){
student stu = qi.make("Enrique",21);
System.out.println("The name is " + stu.getname() + " and the age is " + stu.getage());
}
}
test类接受一个quoteinterface4的实现类对象qi,调用其make方法得到一个student类对象,随后输出相关信息。
main方法使用了Lambda表达式和引用构造器。
程序的输出是:
The name is Enrique and the age is 21
The name is Enrique and the age is 21