Function相关接口简介

什么是Function接口?

interface Function<T, R>,它代表这样的一个函数,接受一个参数,然后返回一个结果。

Function接口的functional方法

R apply(T t)

表示,接受一个类型为T的参数t,返回一个类型为R的结果。注意:

  1. TR可以是同一种类型,当然也可以是不同的类型。
  2. 这里只接受一个参数。

那么问题来了,我有两个、三个参数怎么办?

什么是BiFunction接口?

interface BiFunction<T, U, R>,从名字上大家应该就能推断出来,它代表这样的一个函数,接受两个参数,然后返回一个结果。

BiFunction接口的functional方法

R apply(T t, U u);

表示,接受两个参数t和u,类型分别为TU的,返回一个类型为R的结果。注意:

  1. TUR可以是同一种类型,当然也可以是不同的类型。
  2. 这里只接受两个参数。

现在咱们再来看上面的问题,三个参数的时候怎么办?function包下并没有这样的接口,所以咯,自己动手丰衣足食:

  public interface TripleFunction<T, U, M, R> {
          R apply(T t, U u, M m);
  }

更进一步

function包还很贴心地为我们提供了很多常用的functional接口,其中很大一部分就是和原始类型Primitive Type)有关的。一旦掌握了其中的规律,可以达到举一反三、事半功倍的效果。下面就跟着彬哥一起来看看吧。

作为参数的原始类型来划分

  1. DoubleFunction,接受一个类型为double的参数,返回一个结果。

        @FunctionalInterface
        public interface DoubleFunction<R> {
            R apply(double value);
        }
    
  2. IntFunction,接受一个类型为int的参数,返回一个结果。

        @FunctionalInterface
        public interface IntFunction<R> {
            R apply(int value);
        }
    
  3. LongFunction,接受一个类型为long的参数,返回一个结果。

        @FunctionalInterface
        public interface LongFunction<R> {
            R apply(long value);
        }
    

作为返回值的原始类型来划分

  1. ToDoubleFunction,接受一个参数,返回一个类型为double的结果。

        @FunctionalInterface
        public interface ToDoubleFunction<R> {
            double applyAsDouble(T value);
        }
    
  2. ToIntFunction,接受一个参数,返回一个类型为int的结果。

        @FunctionalInterface
        public interface ToIntFunction<R> {
            int applyAsInt(T value);
        }
    
  3. ToLongFunction,接受一个参数,返回一个类型为long的结果。

        @FunctionalInterface
        public interface ToLongFunction<R> {
            long applyAsLong(T value);
        }
    

参数和返回值相互转化的

3个作为参数的和3个作为返回值的相互组合、去掉重复的

嗯,又Get到6种functional接口:

DoubleToIntFunctionDoubleToLongFunctionIntToDoubleFunctionIntToLongFunctionLongToDoubleFunctionLongToIntFunction

再更进一步

刚刚咱们划分出来的这个12个functional接口都是和Function相关的(一元),那function包有没有给我们提供其他和BiFunction相关的functional接口呢?

当然有。

那咱们就来看看这些二元的functional接口吧。

  1. ToDoubleBiFunction,接受两个参数,返回一个类型为double的结果。

        @FunctionalInterface
        public interface ToDoubleBiFunction<R> {
            double applyAsDouble(T t, U u);
        }
    
  2. ToIntBiFunction,接受两个参数,返回一个类型为int的结果。

        @FunctionalInterface
        public interface ToIntBiFunction<R> {
            int applyAsInt(T t, U u);
        }
    
  3. ToLongBiFunction,接受两个参数,返回一个类型为long的结果。

        @FunctionalInterface
        public interface ToLongBiFunction<R> {
            long applyAsLong(T t, U u);
        }
    

彬哥,这些只是作为返回值的接口,按照上面一元function的划分,那作为参数相互转化的二元接口呢?

那些啊,funciton包就并没有提供了,一来不常用,二来啊,经过彬哥的介绍,相信你已经掌握规律了,很容易就写出来了吧?那就作为课后作业如何?

小结

这一讲,咱们主要介绍了Function相关的functional接口,按大的方面可以以一元二元来分类;再细分的话,可以按原始类型作为参数作为返回值参数返回值相互转化的类别来划分。

另外呀,可以用function包概述及大纲作为参考手册来回顾和查询。


RobynLiu
118 声望3 粉丝

百年后,工程、技术早已古老,但我们的技艺扔将受到尊重。