一,Lambda表达式基础语法
JAVA8中引入了一个新的操作符"->",该操作符称为箭头操作符或Lambda操作符.箭头操作符将Lambda表达式拆分成两部分.
左侧:Lambda表达式的参数列表
右侧:Lambda表达式中所需执行的功能,即Lambda体
语法格式一:无参数,无返回值
() -> System.out.println("Hello,Lambda!") |
语法格式二:有一个参数,无返回值
(x) -> System.out.println(x+"Lambda!") |
语法格式三:若只有一个参数,小括号可以省略不写
x -> System.out.println(x+"Lambda!") |
语法格式四:有两个参数,并且有返回值
(x,y) -> { System.out.println("Hello,Lambda!"); return Integer.compare(x, y); } |
语法格式五:有多个参数,return和大括号都可以省略
(x,y) -> Integer.compare(x, y) |
语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器能通过上下文推断出数据类型,即"类型推断"
(x,y) -> Integer.compare(x, y) (Integer x,Integer y) -> Integer.compare(x, y) |
左右遇一括号省,左侧推断类型省.能省则省
二,"函数式接口"的支持
函数式接口:接口中只有一个抽象方法的接口,称为函数式接口.可以使用注解@FunctionalInterface修饰.Lambda需要函数式接口的支持.
@FunctionalInterface public interface MyInterface<T> { public void test(T t); } |
JAVA8内置的四大核心函数式接口
函数式接口 | 参数类型 | 返回类型 | 用途 |
Consumer<T> 消费型接口 | T | void | 对类型为T的对象应用操作,包含方法: void accept(T t) |
Supplier<T> 供给型接口 | 无 | T | 返回类型为T的对象,包含方法: T get(); |
Function<T, R> 函数型接口 | T | R | 对类型为T的对象应用操作,并返回结果。结果是R类型的对象。包含方法: R apply(T t); |
Predicate<T> 断言型接口 | T | boolean | 确定类型为T的对象是否满足某约束,并返回 boolean 值。包含方法 boolean test(T t); |
其他接口
函数式接口 | 参数类型 | 返回类型 | 用途 |
BiFunction<T, U, R> | T, U | R | 对类型为 T, U 参数应用 操作, 返回 R 类型的结 果。 包含方法为 R apply(T t, U u); |
UnaryOperator<T> (Function子接口) | T | T | 对类型为T的对象进行一 元运算, 并返回T类型的 结果。 包含方法为 T apply(T t); |
BinaryOperator<T> (BiFunction 子接口) | T, T | T | 对类型为T的对象进行二 元运算, 并返回T类型的 结果。 包含方法为 T apply(T t1, T t2); |
BiConsumer<T, U> | T, U | void | 对类型为T, U 参数应用 操作。 包含方法为 void accept(T t, U u) |
ToIntFunction<T> ToLongFunction<T> ToDoubleFunction<T> | T | int long double | 分 别 计 算 int 、 long 、 double、 值的函数 |
IntFunction<R> LongFunction<R> DoubleFunction<R> | int long double | R | 参数分别为int、 long、 double 类型的函数 |
三,方法引用和构造器引用
1.方法引用:若Lambda体中的内容有方法已经实现了,我们可以使用"方法引用".(可以理解为方法引用是Lambda表达式的另外一种实现方式)
三种语法格式:
对象::实例方法名
类::静态方法名
类::实例方法名
PS:1).需要保证函数式接口中的方法参数及返回值与Lambda体中使用方法引用的方法的参数及返回值保持一致
Supplier<String> su1=emp::getName; Supplier<String> su2=() -> emp.getName(); |
BiPredicate<String, String> biP=String::equals; |
格式: ClassName::new
与函数式接口相结合,自动与函数式接口中方法兼容,可以把构造器引用赋值给定义的方法,构造器参数列表要与接口中抽象方法的参数列表保持一致
Employee::new |
3. 数组引用
格式:Type::new
String[]::new |