Function详解

java.util.function中 Function, Supplier, Consumer, Predicate和其他函数式接口广泛用在支持lambda表达式的API中。这些接口有一个抽象方法,会被lambda表达式的定义所覆盖。

@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接口的主要作用是将一个给定的对象进行加工,然后返回加工后的对象,这个加工可以是任何操作.

其核心方法如下:

  • R apply(T t);

    将一个给定的对象进行加工,然后返回加工后的对象,可以将该方法理解为一个一维函数,参数R是自变量,参数T是因变量.

  • default <V> Function<V, R> compose(Function<? super V, ? extends T> before)

    组合函数,在调用当前function之前执行

  • default <V> Function<T, V> andThen(Function<? super R, ? extends V> after)

    组合函数,在调用当前function之后执行

  • static <T> Function<T, T> identity()

    原函数,返回与参数一致的函数,即可以理解为 y = x.

下面对这些方法进行实例测试:

identity()

 class Person{}
  Function<Object, Object> function = Function.identity();
  System.out.println(function.apply(100));
  System.out.println(Function.identity().apply(100111));
  Person person = new Person();
  System.out.println(person == Function.identity().apply(person));

结果为:

100
100111
true

可以看到identity()返回的值与原值是一致的.

andThen()

我们现在用Function.andThen()来实现一个函数:y = 10x + 10;

Function<Integer,Integer> function = x -> x * 10;
function = function.andThen(x -> x+10);
System.out.println(function.apply(8));

结果为:

90

compose()

我们现在用Function.compose()来实现一个函数:y = 10 (10+x) + 10;

Function<Integer,Integer> function = (x -> x * 10);
function = function.compose(x -> x +10);
function = function.andThen(x -> x+10);
System.out.println(function.apply(8));

结果为:

190

与Function接口相关的接口:

  • BiFunction<T, U, R>

    二维函数,可以理解成 z = kx + by,即对给定的两个参数U,R进行加工,生产T

  • DoubleFunction<R>

    用于处理处理将其他类型转成double类型数据的Function

  • IntFunction<R>

    用于处理处理将其他类型转成int类型数据的Function

  • LongFunction<R>

    用于处理将其他类型转成long类型数据的Function

  • LongToIntFunction

    用于处理将long转换成int的Function

  • LongToDoubleFunction

    用于处理将long转换成double的Function

  • ToDoubleBiFunction<T, U>

    用于处理将给定两个参数T,U转换成double类型的BiFunction

  • ToDoubleFunction<T>

    用于处理将其他类型转换成double的Function

  • ToIntBiFunction<T, U>

    用于处理将给定两个参数T,U转换成int类型的BiFunction

  • ToIntFunction<T>

    用于处理将其他类型转换成int的Function

  • ToLongBiFunction<T, U>

    用于处理将给定两个参数T,U转换成long类型的BiFunction

  • ToLongFunction<T>

    用于处理将其他类型转换成long的Function

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容