版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sun8112133/article/details/88824202
版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/88824202#_1369
文章目录
一、Lambda表达式
1、Lambda表达式概述
Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码。使用Lambda表达式可以写出更简洁、更灵活的代码。Lambda表达式的重要用法是简化某些匿名内部类的写法。
2、语法格式
在Lambda表达式中它使用了一个新的操作符 “->”,该操作符称为箭头操作符或 Lambda操作符。
Lambda表达式分为两部分:
左侧: 参数列表
右侧: 所需执行的功能,即Lambda体。
使用Lambda表达式口诀:左右遇一括号省,左侧推断类型省。
3、应用
// 格式一:无参数,无返回值
() -> System.out.println("Hello Lambda!");
// 格式二:有一个参数,无返回值
(x) -> System.out.println(x);
// 格式三:若只有一个参数,小括号可以省略不写
x -> System.out.println(x);
// 格式四:有两个以上的参数,有返回值,并且Lambda体中有多条语句
Comparator<Integer> com = (x, y) -> {
System.out.println("函数式接口");
return Integer.compare(x, y);
};
// 格式五:有两个以上的参数,有返回值,Lambda体中只有一条语句,return 和大括号都可以省略不写
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
// 格式六:参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出数据类型,
// 即“类型推断”。
(Integer x, Integer y) -> Integer.compare(x, y);
二、函数式接口
1、函数式接口概述
接口中只有一个抽象方法的接口,称为函数式接口。可以使用 @FunctionalInterface注解 修饰,用这个注解可以检查是否是函数式接口。
2、使用方式
在只有一个接口的抽象方法上加 @FunctionInterface注解 修饰。
@FunctionalInterface
public interface Inter {
public void show();
}
3、内置的函数式接口
1)四大核心函数式接口
函数式接口 | 参数类型 | 返回类型 | 包含方法 |
---|---|---|---|
Consumer<T> (消费型接口) | T | void | void accept(T t); |
Supplier<T> (供给型接口) | 无 | T | T get(); |
Function<T,R>(函数型接口) | T | R | R apply(T t); |
Predicate<T>(断言型接口) | T | boolean | boolean test(T t); |
2)其他接口
函数式接口 | 参数类型 | 返回类型 | 包含方法 |
---|---|---|---|
BiFunction<T,U,R> | T, U | R | R accept(T t, U u); |
UnaryOperator<T> (Function子接口) |
T | T | T accept(T t); |
BinaryOperator<T> (BiFunction子接口) |
T, T | T | T accept(T t1, T t2); |
BiConsumer<T,U> | T, U | void | void accept(T t, U u); |
ToIntFunction<T> ToLongFunction<T> ToDoubleFunction<T> (分别计算int、long、 double值的函数式接口) |
T | int long double |
int applyAsInt(T t); long applyAsLong(T t); double applyAsDouble(T t); |
IntFunction<R> LongFunction<R> DoubleFunction<R> (参数分别为int、long、 double类型的函数式接口) |
int long double |
R | R apply(int value); R apply(long value); R apply(double value); |
三、方法引用与构造器引用
1、方法引用
1)方法引用概述
接口中实现抽象方法的参数列表,与方法引用方法的参数列表相同时,就使用方法引用啦!
2)语法格式
类名::静态方法
类名::普通方法
对象名::普通方法
3)应用
main {
// 等价(对象名::普通方法),类名::静态方法 类似
Consumer<String> con = (s) -> System.out.println(s));
Consumer<String> con = System.out::println;
}
注: accept()方法的参数列表与println()方法的参数列表相同,所以可以使用方法引用。
main {
// 等价(类名::普通方法)
BiPredicate<String, String> bp = (s1, s2) -> s1.endsWith(s2);
BiPredicate<String, String> bp2 = String::endsWith;
}
注: 第一个参数是该方法的调用者,第二个参数是该方法的参数时,s1是endsWith()方法的调用者,s2是endsWith()的参数,这个时候就可以写成String::endsWith。
2、构造器引用
1)构造器引用概述
需要调用构造器的参数列表要与函数工接口中抽象方法的参数列表保持一致!
2)语法格式
类名::new
3)应用
main {
// 等价
Supplier<Employee> sup = () -> new Employee();
Supplier<Employee> sup2 = Employee::new;
// 等价
Function<Integer, Employee> fun = (x) -> new Employee(11);
Function<Integer, Employee> fun2 = Employee::new;
}
3、数组引用
1)使用格式
类型[]::new
2)应用
main {
// 等价
Function<Integer, String[]> fun = (x) -> new String[x];
Function<Integer, String[]> fun2 = String[]::new;
}