1.1 方法引用
方法引用符
- ::该符号为方法引用符,而它所在的表达式被称为方法引用
如下面代码例子所示
接口:
package Java33.Demo1;
public interface Printable {
void printString(String s);
}
测试:
package Java33.Demo1;
public class PrintableDemo {
public static void main(String[] args) {
usePrintable((s)->{
System.out.println(s);
});
//简化书写
usePrintable(s-> System.out.println(s));
//方法引用来改进,方法引用符号:::
usePrintable(System.out::println);
//可推导的就是可省略的
}
private static void usePrintable(Printable p){
p.printString("sssssssssssss");
}
}
- Lambda表达式:usePrintable(s-> System.out.println(s)); 拿到参数s之后通过Lambda表达式,传递给System.out.println方法处理
- 方法引用:usePrintable(System.out::println); 直接使用System.out中的println方法类取代Lambda表达式,代码更加简洁
1.1 Lambda表达式支持的方法引用
常见方法引用:
- 引用类方法
- 引用对象的实例方法
- 引用类的实例方法
- 引用构造器
引用类方法,其实就是引用类的静态方法
- 格式:类名::静态方法
- 范例:Integer::parseInt
Integer类的方法中有parseInt方法将String转换为Int类型
接口:
package Java33.Demo3;
public interface Converter {
int convert(String s);
}
测试
package Java33.Demo3;
public class ConverterDemo {
public static void main(String[] args) {
//Lambda表达式
useConverter(c->Integer.parseInt(c));
//引用方法--引用类方法
useConverter(Integer::parseInt);
//Lambda表达式被类方法替代的时候,它的形式参数全部传递给静态方法作为参数
}
private static void useConverter(Converter c){
int number = c.convert("22");
System.out.println(number);
}
}
引用对象的实例方法,其实就是引用类中的成员方法
- 格式:对象::成员方法
- 范例:“HelloWorld”::toUpperCase
String 类中的方法:toUpperCase()将此String类所有字符转化为大写
代码例子
package Java33.Demo4;
public class PrintString {
public void printUpper(String s){
String result = s.toUpperCase();
System.out.println(result);
}
}
接口:
package Java33.Demo4;
public interface Printer {
void printUpperCase(String s);
}
测试类:
package Java33.Demo4;
import java.util.Locale;
public class PrinterDemo {
public static void main(String[] args) {
//Lambda表达式
// usePrinter(s->{
String result = s.toUpperCase();
System.out.println(result);
// System.out.println(s.toUpperCase());
// });
//缩写
usePrinter(s-> System.out.println(s.toUpperCase()));
//方法引用,引用对象的实例方法
PrintString ps = new PrintString();//创建一个对象
usePrinter(ps::printUpper);
//Lambda表达式被对象的实例方法替代的时候,它的形式参数全部传递给该方法作为参数
}
private static void usePrinter(Printer p){
p.printUpperCase("HelloWorld");
}
}
引用类的实例方法,其实就是引用类中的成员方法
- 格式:类名::成员方法
- 范例:String::substring
substring()为String类中的一个方法,用于截取一个子字符串
package Java33.Demo5;
public class MyStringDemo {
public static void main(String[] args) {
//Lambda表达式
// uesMyString((String s,int x,int y)-> {
// return s.substring(x,y);
// });
uesMyString((s,x,y)->s.substring(x,y));
//引用类中的实例方法
uesMyString(String::substring);
//Lambda表达式被类的实例方法替代的时候,第一个参数作为调用者,后面的参数全部传递给该方法作为参数
}
private static void uesMyString(MyString my){
String result = my.MySubString("dahsidhiweniwioahdo", 5, 15);
System.out.println(result);
}
}
package Java33.Demo5;
public interface MyString {
String MySubString(String s,int x,int y);
}
引用构造器,其实就是引用构造方法
- 格式:类名::new
- 范例:Student::new