一、Lambda概念
lambda表达式:特殊的匿名内部类,语法更简洁。不会再生成一个.class文件。
lambda表达式允许把函数作为一个方法的参数(函数作为方法参数传递),将代码像数据一样传递。
lambda表达式的本质:作为函数式接口的实例(对象)。
如果接口中只声明了一个抽象方法,则此接口成为函数式接口。
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
注意:只有函数式接口才能使用lambda表达式。可以@FunctionalInterface注解检测
常见的函数式接口:
二、基本语法
<函数式接口> 变量名 = (参数1,参数2)->{
方法体
}
1.举例 (a,b) -> Integer.compare(a,b);
2.格式:
->:lambda操作符或者箭头操作符
->:左边lambda形参列表(接口中抽象方法的形参列表,参数类型可以省略,1个参数时()也可以省略)
->:右边lambda体(重写抽象方法的方法体,只有一条执行语句时,return和{}都可以省略)
3. lambda表达式的使用(分6中情况介绍)
(1) 无参无返回值
@Test
public void test1(){
Runnable r1 =()-> System.out.println("hello lambda");
r1.run();
}
(2)一个参数无返回值
@Test
public void test2(){
Consumer<String> c1 = (String s)-> {
System.out.println(s);
};
c1.accept("一个参数无返回值");
}
(3)数据类型可以省略,因为编译器推断的出,成为类型推断
int a[] = {1,2,3}; //类型推断
List list = new ArrayList<>();//类型推断
@Test
public void test3(){
Consumer<String> c1 = (s)-> {
System.out.println(s);
};
c1.accept(",数据类型可以省略,因为编译器推断的出,成为类型推断");
}
(4)一个参数,参数的小括号可以省略
@Test
public void test4(){
Consumer<String> c1 = s-> {
System.out.println(s);
};
c1.accept("一个参数,参数的小括号可以省略");
}
(5)需要两个或者以上参数,多条执行语句,并且可以有返回值
@Test
public void test5(){
Comparator<Integer> c1 = (a,b) -> {
System.out.println(a);
System.out.println(b);
return a.compareTo(b);
};
int x1 = c1.compare(1,3);
System.out.println("###############################");
System.out.println(x1);
}
6.只有一条语句时,return,大括号都可以不写
public void test6() {
Comparator<Integer> c1 = (a, b) -> Integer.compare(a, b);
int x = c1.compare(1, 3);
System.out.println(x);
}