Lambda是一个匿名函数,可以把Lambda表达式理解为一段可以传递的代码。通过Lambda表达式可以写出更简洁、更灵活的代码,提升了Java语言的表达能力。
从匿名类到Lambda的转换
Java8之前的匿名内部类:
Comparator<Integer> com = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return Integer.compare(o1, o2);
}
};
使用Lambda表达式代替匿名内部类:
Comparator<Integer> com = (x,y) -> Integer.compare(x, y);
Lambda表达式语法
Java8中引入了一个新的操作符 “->” 该操作符称为箭头操作符或 Lambda 操作符箭头操作符将 Lambda 表达式拆分成两部分:
左侧:Lambda 表达式的参数列表
右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体
语法格式一:无参数,无返回值
() -> System.out.println("Hello Lambda!");
语法格式二:有一个参数,并且无返回值
(x) -> System.out.println(x)
语法格式三:若只有一个参数,小括号可以省略不写
x -> System.out.println(x)
语法格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
Comparator<Integer> com = (x, y) -> {
System.out.println("函数式接口");
return Integer.compare(x, y);
};
语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
Comparator<Integer> comparator = (Integer x, Interger y) -> Integer.compare(x, y);
Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
方法引用
若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用
方法引用有如下三种使用情况:
1.对象的引用 :: 实例方法名
Employee emp = new Employee("张三");
Supplier<String> sup = () -> emp.getName();
System.out.println(sup.get());
System.out.println("-----------------------");
Supplier<String> sup2 = emp::getName;
System.out.println(sup2.get());
2.类名 :: 静态方法名
Comparator<Integer> com = (x, y) ->Integer.compare(x, y);
Comparator<Integer> com1 = Integer::compare;
3.类名 :: 实例方法名
BiPredicate<String, String> bp = (x, y) -> x.equals(y);
boolean bool = bp.test(new String("Java"),"Java");
System.out.println(bool);
BiPredicate<String,String> bp2 = String::equals;
bool = bp2.test("Java","Python");
System.out.println(bool);
构造器引用
构造器的参数列表,需要与函数式接口中参数列表保持一致
类名 :: new
Supplier<Employee> sup = () -> new Employee();
System.out.println(sup.get());
System.out.println("------------------------------");
Supplier<Employee> sup2 = Employee::new;
System.out.println(sup2.get());
数组引用
类型[] :: new
Function<Integer, String[]> fun = (args) -> new String[args];
String[] strs = fun.apply(10);
System.out.println(strs.length);
Function<Integer, String[]> fun2 = String[]::new;
String[] strs2 = fun2.apply(20);
System.out.println(strs2.length);