1. 什么是Lambda表达式
Lambda表达式是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升
简单案例
1
| (o1, o2) -> Integer.compare(o1, o2);
|
格式
-> : lambda操作符或箭头操作符
->的左边 : lambda形参列表,对应着要重写的接口中的抽象方法的形参列表
->的右边 : Lambda体,对应着接口的实现类要重写的方法的方法体
2. Lambda表达式的语法
语法格式一:无参,无返回值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Test public void test() { Runnable r1 = new Runnable() { @Override public void run() { System.out.println("小白学Java"); } } }; r1. run();
System.out.println("*************************");
Runnable r2 = () -> { System.out.println("小白学Lambda"); }; r2.run();
|
语法格式二:需要一个传输,但是没有返回值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Test public void test() { Consumer<String> con = new Consumer<String>() { @Override public void accpet(String s) { System.out.println(s); } }; con.accpet("谎言和誓言的区别是什么?");
System.out.println("*************************");
Consumer<String> con1 = (String s) -> { System.out.println(s); }; con1.accept("一个是说的人当真了,一个是听的人当真了") }
|
语法格式三:数据类型可以省略
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @Test public void test() { Consumer<String> con = new Consumer<String>() { System.out.println(s); }; con.accpet("如果大学可以重来,你最想重来的事是什么?");
System.out.println("*************************");
Consumer<String> con1 = (s) -> { System.out.println(s); }; con1.accept("多去其它地方玩玩,别一直搁长沙玩") }
|
语法格式四:形参列表只有一个的时候,小括号也可以省略
1 2 3 4 5 6 7
| @Test public void test() { Consumer<String> con1 = s -> { System.out.println(s); }; con1.accept("多去其它地方玩玩,别一直搁长沙玩") }
|
3. 函数式接口
如果接口中只声明有一个抽象方法,则此接口就称为函数式接口,因为只有给函数式接口提供实现类对象时,我们才能使用Lambda表达式
jdk1.8中声明的函数式接口都在java.uti.function包下
四大核心函数式接口
| 函数式接口 |
称谓 |
参数类型 |
用途 |
| Consumer |
消费型接口 |
T |
对类型为T的对象应用操作,包含方法:void accept(T t) |
| Supplier |
供给型接口 |
无 |
返回类型为T的对象,包括方法:T get() |
| Function<T,R> |
函数型接口 |
T |
对类型为T的对象应用操作,并返回结果。结果是R类型的对象,包含方法R apply(T t) |
| Predicate |
判断型接口 |
T |
确定类型为T的对象是否满足某约束,并返回boolean值,包含方法boolean test(T t) |