Lambda表达式 & @FunctionalInterface
1 简介
作用:Lambda表达式就是属于简化代码,用于简化匿名实现类,提供一种更加简洁的写法。
语法:
(type1 param1, type2 param2...) -> { // 代码逻辑 };
需要注意的是:
(1)参数类型可以省略;
(2)当参数个数只有一个时可以省略掉小括号;
(3)花括号{}中的内容就是方法中的方法体,当方法体中只有一行代码时可以省略{},当方法体中只有一行代码并且需要返回值时也可以省略掉return;
2 Demo
2.1 两个参数,一个返回值
public interface TestService { String sayHello(String name, Integer age); static void main(String[] args) throws Exception { TestService testService = (name, age) -> { System.out.println("name:"+name+",age:"+age); return "executor"; }; testService.sayHello("huaiheng",18); } }
2.2 一个参数,一个返回值
public interface TestService { String sayHello(String name); static void main(String[] args) throws Exception { TestService testService = (name) -> { System.out.println("name:"+name); return "executor"; }; testService.sayHello("huaiheng"); } }
2.3 无参数,一个返回值
public interface TestService { String sayHello(); static void main(String[] args) throws Exception { TestService testService = () -> { return "executor"; }; testService.sayHello(); } }
但是Lambda表达式的要求不是要求方法中仅一个方法而是仅有一个未实现接口,以集合排序示例进行说明:
// 使用匿名内部类 static void main(String[] args) throws Exception { List<String> list = Arrays.asList("aa", "ff", "dd", "bb", "ee", "yy"); Collections.sort(list, new Comparator<String>() { @Override public int compare(String s1, String s2) { return s2.compareTo(s1); } }); System.out.println(list); } // 使用lambda表达式 static void main(String[] args) throws Exception { List<String> list = Arrays.asList("aa", "ff", "dd", "bb", "ee", "yy"); Collections.sort(list, (s1, s2) -> ((String)s2).compareTo((String)s1)); System.out.println(list); }
3 @FunctionalInterface
从以上示例来看,Lambda其实是一种接口类型的数据类型,严格的说实际上是函数式接口,并且lambda表示的接口中只能有一个接口方法,可以有多个静态方法或者默认方法, 每一个该类型的lambda表达式都会被匹配到这个接口方法。
对于注解@FunctionalInterface则专门是针对lambda表达式的,如果使用了该注解,编译器就会检查该接口中的接口方法只能有一个,如果有多个就会报错。
有疑问欢迎留言