Lambda 表达式的基础语法是:java8中引入了一个新的操作符 "->" ,该操作符称为箭头操作符号或者可以称为Lambda操作符
《左右遇一括号省,左侧推断类型省, 能省即省》---程序猿
在lambda表达式中可以分为左右两侧:
左侧:Lambda表达式的参数列表
右侧:Lambda表达式所需执行的功能,也就是Lambda的主体
具体语法一:
当无参数,无返回值的时候: () -> System out print("---");
具体语法二:
当有一个参数,并且无返回值 (x) -> System.out.println("-------");
具体语法三:
当只有一个参数,小括号可以省略不写
具体语法四:
有两个或者两个以上参数,有返回值,并且Lmbda主体中有多条语句
当Lambda主体中有多条语句,则需要使用 { }
Comparator<Integer> comparator = (x1, x2) -> {
return Integer.compare(x1,x2);
}
具体语法五:
若Lambda主体中只有一条语句,return和 {} 都可以省略不写
Comparator<Integer> comparator = (x1, x2) -> Integer.compare(x1, x2);
具体语法六:
Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出数据类型,也就是"类型推断"。
Lambda 的方法引用:
若Lambda体内容有方法实现了,则我们可以使用"方法引用"(即方法引用是Lambda表达式的另一种表现形式)
注:①Lambda体中调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的函数类表和返回值类型保持一致。
②若Lambda参数列表中的第一个参数是实例方法的调用者,二第二个参数是实例方法的参数时,可以使用ClassName::method
语法一:
对象::实例方法名
语法二:
类::静态方法名
语法三:
类::实例方法名
例子:
//对象::实例方法名
public class TestMethod{
@Test
public void test(){
Consumer con = (x) -> System.out.println(x);
PrintStream ps = System.out;
ConSumer<String> con1 = ps::println;
Consumer<String> con2 = System.out::println;
con2.accept("abc"); //输出为abc
}
}
public class Test{
//类::静态方法
@Test
public void test1(){
Compare<Integer> com1 = (x,y) -> Integer.compare(x,y);
Compare<Integer> com2 = Integer::compare;
}
}
public class Test {
//类::实例方法名
@Test
public void test(){
//比较两个字符串是否相同
BiPredicate<String, String> bp = (x,y) -> x.equals(y);
BiPredicate<String, String> bp2 = String::equals;
}
}
构造器引用:
格式:ClassName::new
注:需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致
public class Test{
//构造器引用
@Test
public void test(){
Supplier<Employee> sup =() -> new Employee();
//构造器引用方式
//调用那个构造器是取决于Supplier中的方法的参数(保持一致)
Supplier<Employee> sup2 = Employee::new;
Employee emp = sup2.get();
System.out.println(emp);
}
@Test
public void test2(){
//调用那个构造器是取决于Function中的方法的参数 (保持一致)
Function<Integer,Employee> fun = (x) -> new Employee(x);
Function<Integer,Employee> fun2 = Employee::new;
Employee emp = fun2.apply(101);
System.out.println(emp);
}
}