JKD8 学习
什么叫函数接口?
- 有且只能有一个抽象方法
- 加了@functionalInterface注解
- 不加funcationalInterface 主要满足只有一个抽象方法也会被jdk8认为是函数式接口
function接口
@FunctionalInterface
public interface Function<T, R> {
/**
* Applies this function to the given argument.
*
* @param t the function argument
* @return the function result
*/
R apply(T t);
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
-
R apply(T t);
只接受一个参数,然后返回一个参数 -
compose 方法
default Function<V, R> compose(Function<? super V, ? extends T> before) 方法 先运行传入的这个函数方法然后运行函数本身
- andThen
default Function<T, V> andThen(Function<? super R, ? extends V> after) 方法是先执行函数本身然后在执行传入的function 函数 正好与compose 的方法相反
代码示例如下:
public class FunctionTest {
public static void main(String[] args) {
FunctionTest test1 = new FunctionTest();
System.out.println(test1.compute1(2, value-> value * 3, value -> value * value));
System.out.println(test1.compute2(2, value-> value * 3, value -> value * value));
}
public int compute1(Integer a, Function<Integer,Integer> func1,Function<Integer, Integer> func2) {
return func1.compose(func2).apply(a);
}
public int compute2(Integer a, Function<Integer,Integer> func1,Function<Integer, Integer> func2) {
return func1.andThen(func2).apply(a);
}
}
12
36
- Bifuncation
可以传俩个参数
public int compute3(Integer a, Integer b,BiFunction<Integer,Integer,Integer> func2) {
return func2.apply(a, b);
}
System.out.println(test1.compute3(2, 3, (value,value2) -> value * value2));
Bifuncation 只有一个andThen 方法 没有compose 方法 因为compose 方法是先运行传入函数本身 运行完之后就是一个值了.
那么这样的一个方法就和function 的compose 方法是一样了.
他也无法调用Bifunction 的apply 方法了因为 这个方法需要俩个入参
那么Bifunction 为什么会有andThen呢? 因为andthen方法是先调用函数本身的apply(r,u,t) 调用完之后就变成一个值 可以让入参的function函数调用