lambda表达式可以理解为一种匿名函数的替代方式
lambda的要求
(1)使用lambda表达式只能是对于接口,对于抽象类或者普通类都是不能用的.
(2)并且函数式接口中只能有1个抽象方法与n个静态方法,如果存在多个抽象方法,则不能作为函数式接口(lambda)使用了lambda表达式的形式
(parameters)->expression
(parameters)->{statement;}
形式1:没有参数
()->System.out.println("hello world!");
形式2:只有1个参数
name->System.out.println(name+"hello world!");
形式3:没有参数,但是逻辑复杂
()->{
System.out.println("hello!");
System.out.println("world!");
}
形式4:包含两个参数的方法
BinaryOperator<Long>functionAdd=(x,y)->x+y;
Long result=functionAdd(1L,2L);
形式5:对参数显示声明
BinaryOperator<Long>functionAdd=(Long x,Long y)->x+y;
Long result=functionAdd(1L,2L);
函数式接口
什么样的接口才能使用lambda表达式
1.接口中只有一个抽象方法
2.java8中的函数式接口注解:@FunctionInterface
3.函数式接口的抽象方法签名:函数描述符
其中@FunctionInterface
其实作用就是提示其他人或者编译器,该接口是函数式接口,该接口内只能有一个抽象方法(默认方法不限)。当某些不知道的人 在该接口中又添加了方法时,编译器会有警告。
所以,@FunctionInterface接口仅仅只是提示作用。
方法引用:
1.指向静态方法的方法引用->Integer::parseInt
/**
* (args) -> ClassName.staticMethod(args);
* ClassName::staticMethod;
*/
public void test1() {
Consumer<String> consumer1
= (String number) -> Integer.parseInt(number);
Consumer<String> consumer2
= Integer::parseInt;
}
2.指向任意类型实例方法的方法引用->String::length
/**
* (args) -> args.instanceMethod();
* ClassName::instanceMethod;
*/
public void test2() {
Consumer<String> consumer1
= (String str) -> str.length();
Consumer<String> consumer2
= String::length;
}
3.指向现有对象的实例方法的方法引用->stringBuilder::append
/**
* (args) -> object.instanceMethod(args);
* object::instanceMethod;
*/
public void test3() {
StringBuilder stringBuilder = new StringBuilder();
Consumer<String> consumer1
= (String str) -> stringBuilder.append(str);
Consumer<String> consumer2
= stringBuilder::append;
}
使用举例
Supplier<Mask> supplier = () -> new Mask("3M", "N95");
Consumer<Mask> consumer = (Mask mask) -> {
System.out.println("Brand: " + mask.getBrand() + ", Type: " + mask.getType());
};
consumer.accept(supplier.get());