techiall / Blog

🍋 [My Blog] See discussions
https://github.com/techiall/Blog/discussions
MIT License
8 stars 1 forks source link

Java 函数式编程 #54

Open techiall opened 5 years ago

techiall commented 5 years ago

函数式编程思想

写多了 for 循环,都感觉 for 写的太丑了,能不用 for 就不用 for。后来发现 函数式编程就可以很好的代替 for。

要理解函数式编程,你需要特别明确的知道你要输入的东西,和你要输出的东西。不用考虑中间的过程。这和写的语句有一些不一样,要深入理解函数式编程,首先先要转化一下思考方式。

image

Java 函数式接口

函数接口 形式 作用
Function Function<A, B> toA = (B a) -> {...}; 将 B 转换成 A
Predicate Predicate<A> aIsTrue = (A a) -> {...}; 判断 A 是 true 还是 false
Consumer Consumer<A> aConsumer = (A a) -> {...} 执行某些操作,没有返回值。
Supplier Supplier<A> aSupplier = () -> {return A;} 返回一个对象

日常使用中,FunctionPredicate 用的比较多,把某些方法用函数接口封装起来后,利用 Java 的 stream,可以让你的代码看起来更加简洁,在也不用写 for 循环了。

这些函数接口其实还扩展出来很多其他的接口,如接收两个参数返回一个对象的 BiFunction<A, B, C>,接收 B 和 C,并返回 A;接受一个对象 A 返回一个 int 类型的 IntFunction<A>。其实想想,这个接口也就是相当于 Function<int, A> 接受一个 A 对象,返回一个 int 类型。

我们可以通过猜方法名来知道他的意思,如 ToIntBiFunction<A,B>,意思也就是 接收 A 和 B 两个对象,返回一个 int 类型。

自定义函数接口

如果你觉得自带的这些满足不了你的需求,那你可以选择自定义函数接口。

使用 @FunctionalInterface 注解。

比如你想传进 3 个参数,然后返回 1 个值,那你可以选择写两个 Function,或者就自定义函数接口。形式如下。

    @FunctionalInterface
    public interface toA<A, B, C, D> {
        A apply(B b, C c, D d);
    }

这段代码的意思是,输入 B,C,D 然后输出 A。当然了,你也可以调换顺序写,改成输入 A,B,C 然后输出 D。

    @FunctionalInterface
    public interface toD<A, B, C, D> {
        D apply(A a, B b, C c);
    }

调用的时候,我们可以这样子写

toA<A, B, C, D> toA = (B b, C c, D d) -> {...};
A a = toA(b, c, d);