1. lambda表达式
1. 如果一个接口只有一个抽象方法,那么它是lambda表达式
2. 声明了 @FunctionalInterface 注解的接口
3. 只有一个抽象接口,并没有@FunctionalInterface注解
2. lambda 表达式的基本形式
(type1:param1,type2:param2) -> {body}
(param1,param2) -> {body}
() -> {body}
param -> {body}
箭头函数左边为我们的参数,右边为体。如果右边为表达式的话
那么我们可以将{}省略
3. Function 接口
单个的入参和出参
方法:
1. R apply(T var1);
默认方法,apply会将var作为参数调用我们传递的行为
2. default <V> Function<T, V> andThen
3. default <V> Function<V, R> compose
以上两个方法是可以将任意的2个function接口函数组合
到一起使用,理论上可以无限延伸
compose是先执行参数function的apply再执行自身
andThen相反
4. BiFunction 接口
接收2个入参有一个出参
1. R apply(T var1, U var2);
2. default <V> BiFunction<T, U, V> andThen(Function<? super R, ? extends V> var1)
BiFunction只有andThen 并接收一个 function作为参数
5. Predicate 接口
判定类型接口方法
1. boolean test(T var1);
2. default Predicate<T> and(Predicate<? super T> var1) 逻辑与
3. default Predicate<T> or(Predicate<? super T> var1) 逻辑或
4. default Predicate<T> negate() 取反
5. static <T> Predicate<T> isEqual(Object var0)
6. 示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public static void main(String[] args) {
Test1 test1 = new Test1();
int computer = test1.computer(10, param -> param * param); System.out.println(computer);
int i = test1.computer2(1, 2, (a, b) -> a + b);
System.out.println(i);
boolean b = test1.computer3(1, (a) -> a > 10);
System.out.println(b);
}
public int computer(int a,Function<Integer,Integer> function) { return function.apply(a); }
public int computer2(int a,int b,BiFunction<Integer,Integer,Integer> function) { return function.apply(a,b); }
public boolean computer3(int a, Predicate<Integer> predicate) { return predicate.test(1); }
|
7. Supplier 接口
不接收参数同事返回一个结果
1. T get();
8. Optional 概念
用来解决NPE问题
Optional<String> s = Optional.of("hello ");
s.ifPresent(item -> System.out.println(item));
9. 方法引用
我们可以将方法引用看做一个 函数指针
方法引用分为四类
1. 连续两个冒号,类名::静态方法名
2. 对象名::实例方法名
3. 类名::实例方法名
List<Integer> list = Arrays.asList(1,2,3,4,5);
list.forEach(System.out::println);