- Function是一个接口,在java.util.function包中,下面看一下具体的代码
package java.util.function;
import java.util.Objects;
@FunctionalInterface
public interface Function<T, R> {
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));
}
static <T> Function<T, T> identity() {
return t -> t;
}
}
-
Function一共四个方法,一个抽象方法apply,两个默认方法compose、andThen,一个静态方法identity,关于接口中的default、static方法,
可以参考:Java8特性之接口default和static方法 -
@FunctionalInterface,表示一个函数式接口(只有一个抽象方法的接口就叫做函数式接口,但可以有多个default和static方法,可以显示注明一个接口是函数式接口,也可以不加,但是建议添加注解,表明接口是一个函数式接口);
-
Function<T, R>,T表示参数,R表示返回值。
-
下面看一下具体的使用方法,以下内容需要掌握匿名内部类和Lambda表达式相关内容,
可以参考作者之前写的文章:
Java匿名内部类
Java8特性之Lambda表达式
public class TestFunction {
public static void main(String[] args) {
/**
* 下面两句很好理解,了解匿名内部类和Lambda表达式的都应该看得懂
* 就是实例化一个Function,并实现了apply方法,然后调用apply方法
*/
Function<Integer, String> f = a -> "参数为:" + a;
System.out.println(f.apply(100));
/**
* 下面两句和上面两句一样,只是改变了apply的实现方式
*/
Function<String,Boolean> f1 = b -> b.length() > 4;
System.out.println(f1.apply("hello"));
/**
* 这个地方需要注意一个小细节,f调用andThen时,参数Function的
* 第一个参数的类型和f的返回值类型需要一致,f的返回值类型为String,f1的第
* 一个参数类型正好也是String,如果是f1.andThen(f)这样就不行了
* 下面就看一下andThen这个方法执行的顺序就可以了。
* 首先执行f的apply方法,结果为:参数为:101,然后执行f1的apply
* 方法,“参数为:101”的长度大于4,所有结果为true
*/
System.out.println(f.andThen(f1).apply(101));
Function<Integer, Integer> f2 = c -> c * c;
/**
* 类似andThen,f调用compose时,参数Function的第二个参数的类型
* 和f的参数类型需要一致,f的参数类型为Integer,f2的返回值类型
* 也是Integer。下面就看一下compse这个方法的执行顺序。
* 首先执行f2的apply方法,结果为:16;然后执行f的apply方法,
* 参数为:16,所以结果为:参数为:16
*/
System.out.println(f.compose(f2).apply(4));
/**
* 首先调用f2的apply方法,结果:16
* 第二步,调用f的apply方法,结果:参数为:16
* 第三步,调用f1的apply方法,结果为:true
*/
System.out.println(f.compose(f2).andThen(f1).apply(4));
System.out.println(f2.compose(f2).apply(4));
/**
* 这个就是简单的返回传入的参数
*/
Function<String, String> function3 = Function.identity();
System.out.println(function3.apply("hello-world"));
}
}
- 输出结果:
参数为:100
true
true
参数为:16
true
256
hello-world
好了,Function的大致用法介绍完了,是不是有点晕,先消化一下,我们下节再深入。