:: 该符号为引用运算符,而它所在的表达式被称为方法引用
推导与省略
如果使用 Lambda,那么根据“可推导就是可省略”的原则,无需指定参数类型,也无需指定的重载形式,它们都将被自动推导
如果使用方法引用,也是同样可以根据上下文进行推导
方法引用是 Lambda 的孪生兄弟
引用类方法,其实就是引用类的静态方法
格式:类名::方法名
范例:Integer :: parseInt
注:Lambda 表达式被类方法替代时,它的形参全部传递给静态方法作为参数
代码示例:将 String 类型数字转为 int 类型数字
public interface StringConvert { int convertInt(String s); }
public class Test { public static void main(String[] args) { // lambda方式 usrStringConvert(s -> Integer.parseInt(s)); // 方法引用:引用类方法(静态方法),形参全部传递给静态方法作为参数 usrStringConvert(Integer::parseInt); } public static void usrStringConvert(StringConvert sc) { int num = sc.convertInt("156"); System.out.println("num = " + num); } }
num = 156 num = 156
引用构造器,其实就是引用构造方法
格式:类名 :: new
范例:Student :: new
注:Lambda 表达式被构造器替代时,它的形参全部传递给构造器作为参数
代码示例:创建学生
public class Student { String name; int age; // 省略无参|有参构造方法、get|set方法、toString方法 }
public interface StudentBuilder { Student builder(String name, int age); }
public class Test { public static void main(String[] args) { // lambda方式 usrStudentBuilder((name, age) -> new Student(name, age)); // 方法引用:引用构造器(构造方法),形参全部传递给构造器作为参数 usrStudentBuilder(Student::new); } public static void usrStudentBuilder(StudentBuilder sb) { Student student = sb.builder("张三", 23); System.out.println("student = " + student); } }
student = Student{name='张三', age=23} student = Student{name='张三', age=23}
引用类的实例方法,其实就是引用类中的成员方法
格式:类名 :: 成员方法
范例:String :: substring
注:Lambda 表达式被类的实例方法替代时,第一个参数作为方法调用者,后面其余参数全部传递给该方法作为参数
代码示例:截取字符串,返回一个子串
public interface StringMethod { String mySubString(String string, int begin, int end); }
public class Test { public static void main(String[] args) { // lambda方式 usrStringMethod((string, begin, end) -> string.substring(begin, end)); // 方法引用:引用类的实例方法(成员方法),第一个参数作为方法调用者,后面其余参数全部传递给该方法作为参数 usrStringMethod(String::substring); } public static void usrStringMethod(StringMethod sm) { String string = sm.mySubString("HelloWord!", 3, 6); System.out.println("string = " + string); } }
string = loW string = loW
引用对象的实例方法,其实就引用类中的成员方法
格式:对象::成员方法
范例:"HelloWorld" :: toUpperCase
注:Lambda 表达式被对象的实例方法替代时,它的形参全部传递给该方法作为参数
代码示例
public interface Printer { void printUpper(String s); }
public class PrintString { void printUpperCase(String s) { String string = s.toUpperCase(); System.out.println("string = " + string); } }
public class Test { public static void main(String[] args) { // lambda方式 usrPrinter(s -> System.out.println(s.toUpperCase())); // 方法引用:引用类对象的实例方法(成员方法),形参全部传递给该方法作为参数 PrintString ps = new PrintString(); usrPrinter(ps::printUpperCase); } public static void usrPrinter(Printer p) { p.printUpper("HelloWord!"); } }
HELLOWORD! string = HELLOWORD!