什么是函数式接口?
只包含一个抽象方法的接口,称为函数式接口。
通常我们会在函数式接口上使用@FunctionalInterface注解来标记它是一个函数式接口,使用了该注解标记的接口,会在编译期检查该接口是否是函数式接口,提醒开发者。(非强制性,不使用该注解标记,只要符合只包含一个抽象方法要求同样是函数式接口,但建议使用)
什么是Lambda表达式?
Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(作为参数传入方法中)。而函数式接口可以简写为Lambda表达式,写出更简洁、更灵活的代码。函数式接口和Lambda表达式相辅相成,为Java语言提供了一种更紧凑更易于理解的写法。
// 通常lambda表达式 (a, b) -> { ...}
左侧:指定了 Lambda 表达式需要的参数列表
**右侧:**指定了 Lambda体,是抽象方法的实现逻辑,也即Lambda表达式要执行的功能
常规形式(有参数类型,有括号,有花括号)
public class lamda { public static void main(String[] args) { Hello like = (int i)->{ System.out.println("hello" + i); }; like.hello(5); } } interface Hello { void hello(int i); }
对于多个参数的方法:
public class lamda { public static void main(String[] args) { Hello like = (i,j)->{ System.out.println("hello" + i + j); }; like.hello(5,"world"); } } interface Hello { void hello(int i,String j); }
对于无参或者一个参数的方法:
public class lamda { public static void main(String[] args) { Hello like = i->{ System.out.println("hello" + i); }; like.hello(5,); } } interface Hello { void hello(int i); }
对于只有一行代码的方法:
public class lamda { public static void main(String[] args) { Hello like = (i,j)->System.out.println("hello" + i + j); like.hello(5,"world"); } } interface Hello { void hello(int i,String j); }
总结:
前提是接口为函数式接口(只有一个方法的接口)
以上所有简化形式可以一起使用,即可以既简化参数类型,又可以简化括号
lambda表达式只能有一行代码的情况下才能简化成为一行,如果有多行,那么就用代码块包裹。
多个参数也可以去掠参数类型,要去掉就都去掉,必须加上括号