JAVA8 Function接口以及同类型的特化的接口

我们先来看下Funtion接口的定义

@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;
    }
}

Funtion接口,定义了一个apply的抽象方法,接收一个泛型T对象,并且返回泛型R对象,看到这里,是不是对这个接口的描述,还是一头雾水呢,下面,我们看下几个例子,来讲述这个接口的作用

        Function<Integer, Integer> function1 = x -> x * 2;
        System.out.println(function1.apply(4));// 8

        Function<Integer, String> function2 = x -> x * 2 + "dd";
        System.out.println(function2.apply(4));//8dd
        
        Function<String, String> strFunction1 = (str) -> new String(str);
        System.out.println(strFunction1.apply("aa"));//aa
        
        Function<String, String> strFunction2 = String::new;
        System.out.println(strFunction2.apply("bb"));//bb

        Function<String, Emp> objFunction1 = (str) -> new Emp(str);
        System.out.println(objFunction1.apply("cc").getName());//cc
        
        Function<String, Emp> objFunction2 = Emp::new;
        System.out.println(objFunction2.apply("dd").getName());//dd

 

第一段代码,表示x,为传入参数的类型,也是接口中泛型T,返回的类型也是Integer,调用apply方法,传入Integer的4,做乘法操作,然后返回R的泛型,Integer类型

 

第二段代码,传入的泛型T是Integer的,返回的泛型R是String的,里面的做的操作是传入的参数x 乘2,然后连接一个dd的字符串,然后的就是泛型R的字符串;

后面的表示创建一个对象的两种方式,分别调用有一个参数的构造方法,和无参的构造方法,返回泛型R对象;对象Emp的定义如下

public static class Emp {
        private String name;

        public Emp() {

        }

        public Emp(String name) {
            super();
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

    }

 

这几段代码,可以看出,这个接口,是要传入的泛型T参数,然后做业务操作,然后泛型R;

 

这个接口的其他的默认方法以及静态方法的解释如下代码所示,就不在写案例测试了

 R apply(T t);
    
    /**
     * 先做传入的Function类型的参数的apply操作,再做当前这个接口的apply操作
     * V表示这个Function类型的参数的传入参数类型,也就是本接口的T类型
     * @param before
     * @return
     */
    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }
    /**
     * 先做本接口的apply操作,再做传入的Function类型的参数的apply操作
     * @param after
     * @return
     */
    default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }
    /**
     * 静态方法表示,这个传入的泛型参数T的本身
     * @return
     */
    static <T> Function<T, T> identity() {
        return t -> t;
    }

下面我们看下Funtion这个接口的“扩展”的原始类型特化的一些函数接口

IntFunction<R>,IntToDoubleFunction,IntToLongFunction,LongFunction<R>,LongToDoubleFunction,LongToIntFunction,DoubleFunction<R>,ToIntFunction<T>,ToDoubleFunction<T>,ToLongFunction<T>

我们知道,我们在做基础数据处理的时候(eg: Integer i=0; Integer dd= i+1;),会对基础类型的包装类,进行拆箱的操作,转成基本类型,再做运算处理,拆箱和装箱,其实是非常消耗性能的,尤其是在大量数据运算的时候;这些特殊的Function函数式接口,根据不同的类型,避免了拆箱和装箱的操作,从而提高程序的运行效率

 

1.lambda表达式

《java8 Lambda表达式简介》

《java8 lambda表达式,方法的引用以及构造器的引用》

2.函数式接口

《java8 函数式接口简介》

《JAVA8 Function接口以及同类型的特化的接口》

《JAVA8 Consumer接口》

《JAVA8 Supplier接口》

《JAVA8 UnaryOperator接口》

《JAVA8 BiConsumer 接口》

3.stream接口操作

《java8 Stream接口简介》

《 java8 Stream-创建流的几种方式》

《JAVA8 stream接口 中间操作和终端操作》

《JAVA8 Stream接口,map操作,filter操作,flatMap操作》

《JAVA8 stream接口 distinct,sorted,peek,limit,skip》

《java8 stream接口 终端操作 forEachOrdered和forEach》

《java8 stream接口 终端操作 toArray操作》

《java8 stream接口 终端操作 min,max,findFirst,findAny操作》

《java8 stream接口终端操作 count,anyMatch,allMatch,noneMatch》

《java8 srteam接口终端操作reduce操作》

《java8 stream接口 终端操作 collect操作》

4.其他部分

《java8 Optional静态类简介,以及用法》

  • 10
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
C++ 函数模板是指为定的数据类型或者定的函数参数提供殊的实现。这样可以在处理某些殊情况时,使用不同的实现逻辑,以满足定的需求。 函数模板的语法如下: ```cpp template <> return_type function_name<specific_type>(parameters) { // 实现的代码 } ``` 其中,`template <>` 表示这是一个函数模板的版本,`specific_type` 是要的数据类型,`function_name` 是要的函数名,`parameters` 是函数的参数列表,`return_type` 是函数的返回类型。 举个例子,设我们有一个通用的函数模板用于计算两个数相加: ```cpp template <typename T> T add(T a, T b) { return a + b; } ``` 如果我们想要为 `int` 类型提供一个版本,实现乘法运算而不是加法运算,可以这样写: ```cpp template <> int add<int>(int a, int b) { return a * b; } ``` 这样,在使用 `add` 函数模板时,如果参数是 `int` 类型,就会自动选择版本进行计算。 需要注意的是,函数模板是根据数据类型进行匹配的,而不是根据参数数量或者参数类型进行匹配。因此,在进行函数模板时,要确保版本与通用版本的参数类型和数量完全一致,否则可能会导致编译错误。 另外,还可以进行部分,即只其中一部分参数类型。部分的语法与完全类似,只是在模板参数列表中指定部分参数类型即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葵花下的獾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值