Java8-lambda表达式

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);