Java 8 Function函数式接口

Java 8 Function函数式接口

介绍

函数式接口其实就是一个抽象接口类,在Java 8之前已有的函数式接口有以下。

java.lang.Runnable
java.util.concurrent.Callable
java.util.Comparator

等等...

使用方法

其实上述所说的接口类只需要使用FunctionalInterface注解修饰,就成为了Java中的函数式接口。比如JDK中Callable接口定义

@FunctionalInterface
public interface Callable<V> {
    V call() throws Exception;
}

就这么简单。
现在来讲讲Java 8新增Function接口。下面是其定义

// T 是传入参数
// R 是返回参数
@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;
    }
}

他可以理解为C语言中的函数指针(个人看法)。
在实际使用中,apply方法使用比较广泛。compose/andThen多用于两个以上函数接口并且执行上有先后顺序的场景下。
在具体业务代码中,我一般结合BiFuncton/Supplier一起使用。BiFunction支持2个参数的,Function只支持一个参数。Supplier可以用来存储具体需要的值,通过get来获取。

例子

引用平时工作的代码。该例子主要规避了多个判断条件if/else造成代码臃肿的,同时也可以把相同的业务逻辑抽象出函数接口,从而可以在多处代码重用。具体代码如下。

Function<Object, Integer> actionTest1 = (object) -> {
    // logic
    return 0;
};

Function<Object, Integer> actionTest2 = (object) -> {
    // logic
    return 0;
};

public Supplier<Map<Integer, Function<Object, Integer>>> actionSupplier = () -> {
        Map<Integer, Function<Object, Integer>> maps = new HashMap<>();
        maps.put(1, actionTest1);
        maps.put(2, actionTest2);
        return maps;
};
// 具体使用
public void test(int type, Object object) {
    Optional.ofNullable(actionSupplier.get().get(type)).ifPresent(x -> x.apply(v, object));
    // if/else 逻辑
    if (type == 1) {
        // test1 logic
    } else if (type == 2) {
        // test2 logic
    }
}

总结

个人认为,在业务逻辑分支判断较多的场景,是比较适合使用Function的,而且还有以下几点好处

  • 代码看上去比较简洁
  • 相同逻辑可以重用(当然封装成函数也是可以的~)
  • 代码后期比较好维护点。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,808评论 25 709
  • 我在光阴里含笑,光阴亦是热情欢闹。珍爱每一个今天,便再无所谓昨天或明天,每一天都将是生命中的艳阳天。
    无忌西东7阅读 234评论 0 10
  • 晚上五点,夜幕降临,唐露露和家里打了个招呼之后就出去了。一个小时后,唐露露推开砚亭酒店的大门,砚亭是A市最大...
    汉晗阅读 259评论 0 0
  • 2018–02–24/25 周日 晴 说起遇见... 这个故事好像犹如远方的春雷,已有些模糊,回忆也需...
    初初l阅读 105评论 7 3