目录
简介
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
-
规则
1. lambda表达式可以有零个、一个或多个参数;2. 可以显式声明参数的类型,也可以从上下文推断参数的类型;3. 多个参数必须包含在括号中,并用逗号分隔,空括号用于表示零个参数;4. 当只有一个参数时,如果推断它的类型,可以不使用括号。如 a -> return a * a;5. lambda表达式的函数体可以包含零个,一个或多个语句;6. 如果lambda表达式的函数体只有一行,则可以不用大括号,匿名函数的返回类型与函数体表达式的返回类型相同。当函数体中大于一行代码则需要用大括号包含。
-
代码说明
public static void lambda(){
//无参数表达式
Supplier<Integer> integerSupplier = () -> 2;
System.out.println(integerSupplier.get());
//一个参数: a -> System.out.println(a);
//多个参数需要加括号: (a,b) -> a+b;
//多个语句需要加大括号: (a,b,c) -> { int s = a+b; s+=c;}
}
-
特殊语法
-
方法引用
* 对象::实例方法名;* 类::静态方法名;* 类::实例方法名
@Test public void test4() { Comparator<Integer> com = (x,y) -> Integer.compare(x, y); // 类::静态方法名; 静态方法返回值必须和函数式接口的返回值类型一致 Comparator<Integer> comp2 = Integer::compare; //比较两个字符串相等 BiPredicate<String, String> bi = (x, y) -> x.equals(y); boolean flag = bi.test("2", "2"); // 类::实例方法名;lambda参数列表中第一个参数是实例方法的调用者,而且第二个参数是实例方法的参数时,可以使用ClassName::merhod BiPredicate<String, String> bi2 = String::equals; //对象::实例方法名; PrintStream out = System.out; Consumer<String> coms = out::println; Consumer<String> coms2 = System.out::println; }
-
数组引用
Type::new
@Test
public void test4() {
//数组引用
// Type::new
Function<Integer, String[]> fun = String[]::new;
String[] str = fun.apply(10);
System.out.println(str);
}
-
构造器引用
//ClassName::new
//构造器引用方法,根据函数式接口的参数个数,决定调用的构造器
@Test
public void test4() {
Supplier<User> sup = () -> new User();
//ClassName::new
//构造器引用方法,根据函数式接口的参数个数,决定调用的构造器
Supplier<User> sup2 = User::new;
}