Lambda表达式
1. 描述
Lambda表达式是在jdk1.8出现的一种语法,其主要是函数式接口的一种简写方式,描述了数据的传递,使我们的代码更加的简洁。
但是它并不是能够随便用的,其只能用于函数式接口(函数式接口是指有且仅有一个抽象方法的接口);
2. 语法
其整个语法比较简单,主要分为三部分(参数列表,箭头,方法处理逻辑)组成:(参数列表) -> {方法的处理}
(参数列表):这个主要是要调用的方法所使用的参数
->:将Lambda表达式分为两部分,左边为参数列表,右边为方法处理,是Lambda表达式的一个标志
{方法的处理}:这个主要是该表达式要进行的一些操作。
上面的语法是Lambda表达式的标准的语法,其语法的有些部分在一些情况下是可以省略的:
- 当参数只有一个的时候其语法中的括号是可以省略的,但是需要注意的是当无参时括号是不可以省略的。
- 当方法的处理只有一行时,其大括号{}是可以省略的,如果是多行的话则不可以省略。省略大括号时需要注意的是当这一行是return语句的话,return也必须要省略,未省略大括号时,return语句也不能省略。
3. 分类
Lambda表达式按照其参数和返回值可以大致分为下面几类:
有参无返回值
其中有参无返回值的可以用四大函数式接口中的Consume<T>,样例代码如下:
Consumer<String> consumer = s -> System.out.println(s.toUpperCase());
consumer.accept("abc");
输出结果为:

描述:
上面的Lambda表达式的意思是,将参数s中的字母转为大写,然后打印控制台,其中参数是String类型。
有参有返回值
其中有参有返回值的可以用四大函数式接口中的Function<T, R>,样例代码如下:
Function<String, Boolean> function = (s) -> s.isEmpty();
System.out.println(function.apply("abc"));
System.out.println(function.apply(""));
输出结果为:

描述:
上面Lambda表达式的意思是输入一个String,然后判断这个String是否为空,其中返回值为Boolean类型。
无参有返回值
其中无参有返回值的可以用四大函数式接口中的Supplier<T>,样例代码如下:
Supplier<Integer> supplier = () -> (int)Math.floor(Math.random() * 100);
System.out.println(supplier.get());
输出结果为:

描述:
上面的Lambda表达式的意思是随机生成一个100以内的一个整数
无参无返回值
其中无参无返回值的最典型的样例就是Thread(),样例代码为:
new Thread(() -> System.out.println("当前线程:" + Thread.currentThread().getName())).start();
输出结果为:

描述为:
上面的Lmabda表达式的意思则为,通过新的线程输出一行结果,当让这里可以是你任何处理的逻辑。
PS:当然上面的每种函数式接口可以自己实现,根据自己的需求来实现不同的函数表达式,可以通过注解@FunctionalInterface来判断你实现的是否为函数式接口,然后使用lambda表达式。
4. 四大函数式接口
| 函数式接口 | 参数类型 | 返回类型 | 用途 |
|---|---|---|---|
Consumer<T>消费型接口 |
T | void | 对类型为T的对象进行操作,通过方法void accept(T t)进行调用 |
Supplier<T>供给型接口 |
无 | T | 返回类型为T的对象,通过方法T get()调用,主要用于类的声明,比如Person::new |
Function<T, R>函数型接口 |
T | R | 对类型为T的对象进行操作并返回类型为R的对象,通过方法R apply(T t)调用 |
Predicate<T> 断言型接口 |
T | boolean | 进行判断类型为T的对象是否满足某条件,并返回一个boolean类型的值,通过方法boolean test(T t)调用 |
5. 方法引用
方法引用时lambda表达式的另一种写法,当腰传递给Lambda体的操作,已经有实现的方法了,那么可以使用方法引用,其使用是通过::符合将方法名和对象或类名分隔开。
其主要使用场景有:
对象::实例方法
类::静态方法
类::实例方法
而方法引用能够这样简写的原因是因为其简写的方法与重写的方法的参数与返回值,处理逻辑是一样的。比如重写的方法就是一个打印方法,那么就可以简写为System.out::println
6. 总结
Lambda表达式总的来说比较重要的是他的语法,理解他的语法后可以发现其并不是多难。只要是函数式接口就可以根据语法套用lambda表达式。
浙公网安备 33010602011771号