Java8新特性 Lambda表达式
1-基本语法
左边:Lambda表达式形参列表
右边:Lambda表达式重写的方法体,接口中需要重写的方法
对于接口,以前的做法是在大括号内重写匿名内部类,完成接口方法的重写,这一次可以使用Lambda表达式完成。
2-六种使用方法
import org.junit.Test;
import java.util.Comparator;
import java.util.function.Consumer;
public class LambdaTest {
// 方法1:无参、无返回值的写法
@Test
public void test1() {
Runnable r1 = () -> System.out.println("哈哈");
r1.run();
}
// 方法2:带参、无返回值
@Test
public void test2() {
Consumer<String> com = (String s) -> {
System.out.println(s);
}; // 整个作为对象出现,需要补分号
com.accept("喜喜");
}
// 方法3:省略数据类型的写法
@Test
public void test3(){
Consumer<String> con = (s) ->{
System.out.println(s);
}
}
// 方法4:带一个参数,无返回值,同时省略小括号与数据类型
@Test
public void test3(){
Consumer<String> con = s ->{
System.out.println(s);
};
con.accept("你好xxx!");
}
// 方法5:带两个参数,并且有返回值
@Test
public void test4(){
Comparator<Integer> com = (x,y)->{
System.out.println("函数实现的比较方法");
return Integer.compare(x,y);
};
System.out.println(com.compare(3,4));
}
// 方法6:Lambda表达式只有一条执行语句时,省略大括号与return
@Test
public void test5(){
Comparator<Integer> com = (x,y)-> Integer.compare(x,y);
System.out.println(com.compare(100,50));
}
}
3-函数式接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为 lambda 表达式。
函数式接口的类型有:
消费型:接收值,但不返回
函数型:接收值,返回另一个值
供给型:不接收值,但返回对象
判断型:确定传入的值是否满足某个约束,返回True和False
4-总结
关于左边:lambda形参列表的参数类型可以省略,如果只有一个参数,那么小括号也可以省略
关于右边:lambda体使用{};包裹,如果Lambda只有一条语句,则可以省略{}与return关键字
如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口。我们可以在一个接口上使用 @FunctionalInterface 注解,
这样做可以检查它是否是一个函数式接口。
Lambda表达式的本质:作为函数式接口的实例