如果Lambda 表达式的代码块只有一行代码,程序就可以省略表达式代码块的花括号,不仅如此,如果只有一行代码,还可以使用方法的引用和构造器的引用
下面为四种引用的实例
public class function {
@FunctionalInterface
interface Converter{
/*将String转成int的方法*/
int converter(String from);
}
@FunctionalInterface
interface Mytest3{
String mytest3(String a,int b,int c);
}
@FunctionalInterface
interface Mytest4{
JFrame win(String title);
}
public static void main(String[] args) {
/**
* 1、引用类方法
*/
//创建 Converter对象 匿名内部类实现
Converter converter = new Converter(){
@Override
public int converter(String from) {
return Integer.parseInt(from);
}
};
//创建 Converter对象 Lambda 实现
converter = from->Integer.valueOf(from);
//方法引用代替Lambda 表达式
converter = Integer::valueOf;
//调用converter 实现
int number =converter.converter("5");
System.out.println("整数="+number);
/**
* 2、引用特定对象的实例
*/
//创建 Converter对象 Lambda 实现
converter = from->"HELLO WORLD".indexOf(from);
//引用特定对象的实例代替Lambda 表达式
converter = "HELLO WORLD"::indexOf;
number =converter.converter("WO");
System.out.println("索引="+number);
/**
*3、引用某类对象的实例方法
*/
Mytest3 test = (a,b,c)-> a.substring(b, c);
//引用特定对象的实例代替Lambda 表达式
/* 引用某类对象的实例方法时注意点:
* 1、函数式接口中被实现的方法的第一个参数作为调用者
* 2、后面的参数全部传给改参数作为方法
*
* */
test = String::substring;
String subString=test.mytest3("HELLO WORLD", 2, 5);
System.out.println("截取的字符串为="+subString);
/**
* 4、引用构造器
*/
Mytest4 jfMytest4=title-> new JFrame(title);
//引用构造器代替Lambda 表达式
jfMytest4= JFrame::new;
JFrame jFrame=jfMytest4.win("我的窗口");
System.out.println(jFrame);
}
}
lambda 和匿名内部类的区别和联系
lambdab表达式是匿名内部类的简化,因此,可以取代部分匿名内部类。
相同点:
1、都可以直接访问局部变量以及外部类的成员变量
2、创建的匿名对象一样,都可以直接调用,从接口中继承 的默认方法
区别:
1、匿名内部类可以为任意接口创建实例—无论接口中有多少个方法,匿名内部类只需实现即可,lamdba表达式只能为函数式接口创建实例
2、匿名内部类实现的抽象方法中允许调用接口的默认方法,当lambda表达式的代码块中不允许调用接口中定义的默认方法