Lambda 表达式
Lambda 表达式,也可称为闭包,是一个匿名函数
语法:(parameters) -> { statements; }
- ->将参数和实现分开
- (parameters),参数列表。参数类型可省略;只有一个参数()可省略;参数名称不允许与外层局部变量相同。
- { statements; },函数的具体实现。只有一行语句{}可省略,return不用写。只能引用标记了 final 的外层局部变量。
函数式接口
- 有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
- @FunctionalInterface标识函数式接口,但该标识不是必须的。不是函数式接口使用该标识会报错。
java.util.function
接口 | 抽象方法 | 解释 |
---|---|---|
Predicate<T> | boolean test(T t); | 断言型,有输入有返回 |
Function<T, R> | R apply(T t); | 函数型,有输入有返回 |
Consumer<T> | void accept(T t); | 消费型,有输入无返回 |
Supplier<T> | T get(); | 供给型,无输入有返回 |
public static void main(String args[]) {
Predicate<String> predicate = param -> false;
Function<String, String> function = param -> null;
Consumer<String> consumer = param -> System.out.println(param);
Supplier<String> supplier = () -> null;
boolean test = predicate.test(""); //false
String apply = function.apply(""); //null
consumer.accept(""); //void
String get = supplier.get(); //null
}
方法引用
调用接口的方法,实际上调用的是接口引用的方法。
- 引用构造器:
Class::new
- 引用静态方法:
Class::static_method
- 类对象引用类的方法:
Class::method
- 实例对象的方法引用:
instance::method
public static void main(String args[]) {
//1. 引用构造器
Supplier<String> supplier1 = () -> new String();
Supplier<String> supplier2 = String::new;
Function<String, String> function1 = param -> new String(param);
Function<String, String> function2 = String::new; //方法参数一致
Predicate<String> predicate1 = param -> new Boolean(param);
Predicate<String> predicate2 = Boolean::new; //方法参数一致
//2.引用静态方法
Function<String, String> function3 = param -> String.valueOf(param);
Function<String, String> function4 = String::valueOf; //方法参数一致
3.类对象引用类的方法
Predicate<String> predicate3 = param -> param.isEmpty();
Predicate<String> predicate4 = String::isEmpty;
//4.实例对象的方法引用
Function<Integer, Character> function5 = param -> "HELLO".charAt(param);
Function<Integer, Character> function6 = "HELLO"::charAt; //方法参数一致
}