Java8 4大函数式接口

2022-08-09 15:25:59 浏览数 (1)

本文将针对Lambda表达式进一步了解与学习,在使用Lambda表达式之前,有一个东西非常重要,那就是函数式接口,接下来,本文将讲解Java8内置的四大核心函数式接口。

一、Function<T, R>:函数型接口(R apply(T t))

代码语言:javascript复制
/**
     * 字符串操作
     * @param str 需要处理得字符串
     * @param fun Function接口
     * @return  处理之后得字符串
     */
    public String operatorStr(String str,Function<String,String> fun){
        return fun.apply(str);
    }
    /**
     * 函数型接口:Function<T,R>
     */
    @Test
    public void test5(){
        String s=operatorStr("中国四大名著",str->str.substring(0,2));
        System.out.println(s);
    }

上面就是一个函数型接口,输入一个类型得参数,输出一个类型得参数,当然两种类型可以一致。

二、Consumer<T>:消费型接口(void accept(T t))

代码语言:javascript复制
public void consumerMoney(double money,Consumer<Double> c){
        c.accept(money);
    }
    /**
     * 消费型接口Consumer<T>
     */
    @Test
    public void test6(){
        consumerMoney(368,x->System.out.println("昨日买了个表,花了" x "元人民币。"));
    }

  以上为消费型接口,有参数,无返回值类型的接口。

三、Supplier<T>:供给型接口(T get())

代码语言:javascript复制
/**
     * 随机产生sum个数量得集合
     * @param sum 集合内元素个数
     * @param sup Supplier<T> 供给型接口
     * @return
     */
    public List<Integer> randomNum(int sum, Supplier<Integer> sup){
        List<Integer> list=new ArrayList<>();
        for(int i=0;i<sum;i  ){
            list.add(sup.get());
        }
        return list;
    }

    /**
     * 供给型接口,Supplier<T>
     */
    @Test
    public void test7(){
        Random r=new Random();
        List<Integer> list=randomNum(10,()->r.nextInt());
        list.forEach(System.out::println);
     }

  上面就是一个供给类型得接口,只有产出,没人输入,就是只有返回值,没有入参

四、Predicate<T>:断言型接口(boolean test(T t))

代码语言:javascript复制
/**
     * 过滤字符串
     * @param list 待过滤的字符串列表
     * @param pre 断言型接口:Predicate<T>
     * @return  过滤后新的字符串列表
     */
    public List<String> filterStr(List<String> list, Predicate<String> pre){
        List<String> filterList=new ArrayList<>();
        for(String str : list){
            if(pre.test(str))
                filterList.add(str);
        }
        return  filterList;
    }
    @Test
    public void test8(){
        List<String> list=new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");
        list.add("田七");
        list.add("王八");
        list.add("何九");
        filterStr(list,str->!str.startsWith("王")).forEach(System.out::println);
    }

  上面就是一个断言型接口,输入一个参数,输出一个boolean类型得返回值。

其他类型的一些函数式接口

 除了上述的四大类型函数式接口外还有其他的一些接口供我们使用:   1. BiFunction<T, U, R>

其中T,U是2个入参参数类型,R为返回值。方法R apply(T, U)

  2.UnaryOperator<T>(Function子接口)

其中T是入参参数类型,进行一元操作,并返回T类型。方法T apply(T)

  3. BinaryOperator<T>(BiFunction子接口)

其中T是入参参数类型,进行二元操作,并返回T类型。方法T apply(T,T)

  4.BiConsumcr(T, U)

其中T,U是2个入参参数类型,无返回值。方法void accept(T, U)

  5.ToIntFunction<T>、ToLongFunction<T>、ToDoubleFunction<T>

其中T是入参参数类型,返回值分别为int,long,double,分别计算int,long,double的函数。

  6.IntFunction<R>、LongFunction<R>、DoubleFunction<R>   参数分别为int,long,double,返回值为R。

  以上就是java8内置的核心函数式接口,其中包括了大部分得方法类型,所以可以在使用得时候根据不同得使用场景去选择不同得接口使用。

0 人点赞