lambda表达式是java8的新特性之一,功能强大,写法简单,实乃java中的“大杀器”。
1.初识Lambda
首先展示一个例子,然后我们用lambda实现同样的功能,方便比较和认知。
//定义一个运算,并输出结果
@FunctionalInterface
public interface ComputeInterface<E> {
void add(E e1,E e2);
}
public class Compute implements ComputeInterface<Integer> {
@Override
public void add(Integer e1, Integer e2) {
System.out.println(e1 + e2);
}
}
public class ClientTest {
//调用上面的计算的方法
@Test
public void addTest(){
ComputeInterface compute = new Compute();
compute.add(1,2);
}
//lambda表达式实现同样的接口
@Test
public void lambdaTest(){
ComputeInterface<Integer> computeInterface = (x,y) -> System.out.println(x+y);
computeInterface.add(2,7);
}
}
通过上述简单的例子,我们可以了解到以下几点:
1. lambda表达式可以看做是对接口的特定实现,写法相当于Compute.java的简写。
也有人称Lambda表达式为“语法糖”。
2. 如果对接口add(E e1,E e2) 添加其它实现,如两个String的拼接,以前需要再写一个实现类:
public class ComputeString implements ComputeInterface<String> {
@Override
public void add(String e1, String e2) {
System.out.println("Result:");
System.out.println(e1 + e2);
}
}
而使用Lambda可以简单的改写:
ComputeInterface<String > computeInterface = (x,y) -> System.out.println(x+y);
2. 基本概念
- lambda表达式可以说是对接口的方法的实现。但是这个接口很特殊,被称为“函数式接口”。
- 函数式接口:只有一个方法声明的接口。可以用@FunctionalInterface标签检测。
如例子中的ComputeInterface。
3. 基本语法
(左侧参数列表) -> (右侧表达式)
- “->” 称为“lambda表达式符号”
- 常见的几种写法
1. 无参数,无返回值
@Test
public void lambdaTest1(){
Runnable runnable = () -> System.out.println("hello lambda !");
runnable.run();
}
2. 一个参数,有返回值
@Test
public void lambdaTest2(){
Consumer<Integer> con = (x) -> System.out.println(x * x) ;
con.accept(10);
}
结果
100
3. 有参数,有返回值
@Test
public void lambdaTest3(){
IntFunction<Integer> fun = (x) ->{return x * x ; };
IntFunction<Integer> fun1 = (x) -> x * x ; // 只有一行代码,可以省略return 和 {}
int result = fun.apply(10);
int result1 = fun1.apply(10);
System.out.println(result);
System.out.println(result1);
}
3. java8中常用的函数式接口
java8新增了很多函数式接口,我们只需使用lambda表达式实现它即可。详情见java.util.function包。如果没有自己需要的,也可以先定义一个函数式接口,然后再使用。
函数式接口 | 函数描述符 | 原始类型特化 |
---|---|---|
Predicate | T->boolean | IntPredicate, LongPredicate, DoublePredicate |
Consumer | T->void | IntConsumer, LongConsumer, DoubleConsumer |
Function | T->R | IntFunction, IntToDoubleFunction, IntToLongFunction, LongFunction, LongToDoubleFunction, LongToIntFunction, DoubleFunction, ToIntFunction, ToDoubleFunction, ToLongFunction |
Supplier | ()->T | BooleanSupplier, IntSupplier, LongSupplier, DoubleSupplier |
UnaryOperator | T->T | IntUnaryOperator, LongUnaryOperator, DoubleUnaryOperator |
BinaryOperator | (T,T)->T | IntBinaryOperator, LongBinaryOperator, DoubleBinaryOperator |
BiPredicate | (L,R)->boolean | |
BiConsumer | (T,U)->void | ObjIntConsumer, ObjLongConsumer, ObjDoubleConsumer |
BiFunction | (T,U)->R | ToIntBiFunction, ToLongBiFunction, ToDoubleBiFunction |