lambda表达式和方法引用是孪生兄弟,方法引用的使用在很多情况下简化了lambda表达式。
方法引用符 ::
由lambda表达式简化得到方法引用,体验方法引用:
package com.demo.method;
public class PrintableDemo {
public static void main(String[] args) {
//lambda表达式
print(s->System.out.println(s));
//方法引用
print(System.out::println);
}
static void print(Printable p) {
p.printString("hello word!");
}
}
interface Printable {
void printString(String s);
}
输出结果:
hello word!
hello word!
引用类方法:
package com.demo.method;
/**
* 引用类方法,例将字符串通过Integer.parseInt()转化为大写字符串
*/
public class ConverterDemo {
public static void main(String[] args) {
useConverter(Integer::parseInt);
}
static void useConverter(Converter con) {
int a=con.convert("34");
System.out.println(a);
}
}
interface Converter {
int convert(String a);
}
输出结果:
34
引用对象的实例方法:
package com.demo.method;
/*
* 引用对象的实例方法
*/
public class PrinterDemo {
public static void main(String[] args) {
//使用lambda表达式
usePrinter(s->System.out.println(s.toUpperCase()));
//使用对象的实例方法
PrintString pr=new PrintString();
usePrinter(pr::printUpper);
//如果方法是静态的就直接类::方法名
usePrinter(PrintString::printUpper1);
}
static void usePrinter(Printer pr){
pr.printUpperCase("hello word!");
}
}
interface Printer {
void printUpperCase(String a);
}
class PrintString {
public void printUpper(String str) {
System.out.println(str.toUpperCase());
}
static void printUpper1(String str) {
System.out.println(str.toUpperCase());
}
}
输出结果:
HELLO WORD!
HELLO WORD!
HELLO WORD!
引用类的实例方法:
package com.demo.method;
/*
* 引用类的实例方法
*/
public class MyStringDemo {
public static void main(String[] args) {
//使用lambda表达式
useMyString((str,a,b)->str.substring(a, b));
//使用类中的实例方法
useMyString(String::substring);
//lambda表达式被类的实例方法替代的时候,第一个参数最为调用者,后面的参数作为方法参数,如上例
}
static void useMyString(MyString mys) {
String str=mys.mySubString("hello", 2 ,4);
System.out.println(str);
}
}
interface MyString{
String mySubString(String str,int a,int b);
}
输出结果:
11
11
引用构造器:
package com.demo.method;
/*
* 引用构造器
*/
public class StudentDemo {
public static void main(String[] args) {
//lambda表达式
useStudentBuilder((s,a)->new Student(s, a));
//引用构造器
useStudentBuilder(Student::new);
//将参数全部传到构造器中
}
private static void useStudentBuilder(StudentBuilder stu) {
Student s= stu.build("小飞", 20);
System.out.println(s.getName()+" "+s.getAge());
}
}
class Student{
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
String name;
int 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;
}
}
interface StudentBuilder{
Student build(String name,int age);
}
输出结果:
小飞 20
小飞 20
注:参考文献: