java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > 函数式接口Function和BiFunction

JAVA中的函数式接口Function和BiFunction详解

作者:时间不会赖着不走

这篇文章主要介绍了JAVA中的函数式接口Function和BiFunction详解,JDK的函数式接口都加上了@FunctionalInterface注解进行标识,但是无论是否加上该注解只要接口中只有一个抽象方法,都是函数式接口,需要的朋友可以参考下

函数式接口

只有一个抽象方法的接口我们称之为函数接口。 ​

JDK的函数式接口都加上了@FunctionalInterface注解进行标识。但是无论是否加上该注解只要接口中只有一个抽象方法,都是函数式接口。

为什么要用函数式接口

其实就是为了适应转化成lambda表达式,写成具体的方法也可以,但是就是多要多写一些代码,引入函数式接口就是为了配合转化成极简lambda表达式简化代码

怎么使用Function ,BiFunction计算转换接口

Function

举例如下:一个测试字符串长度的例子

没转化之前

public class function {
    static Function<String, Integer> strLen = new Function<String, Integer>() {
        @Override
        public Integer apply(String s) {
            int length = s.length();
            return length;
        }
    };
    public static void main(String[] args) {
        System.out.println("Function 示例, 字符串长度: " + strLen.apply("Hello"));
    }
}

转化之后

public class function {
    static Function<String, Integer> strLen = s -> {
        int length = s.length();
        return length;
    };
    public static void main(String[] args) {
        System.out.println("Function 示例, 字符串长度: " + strLen.apply("Hello"));
    }
}

可以再简化

public class function {
    static Function<String, Integer> strLen = String::length;
    public static void main(String[] args) {
        System.out.println("Function 示例, 字符串长度: " + strLen.apply("Hello"));
    }
}

测试结果:

在这里插入图片描述

上面这个例子其实没有必要创建一个接口来返回字符串的长度,这是简化操作,例如下面想将一个过滤桶中的数据进行转化封装,那么你大可写一个转化函数,加上参数和返回值,也可以利用JAVA8中封装好的函数式计算转换接口Function进行编写,如下

private Function<Filters , LinkedHashMap<String, Long>>  RESULT_CONVENT = new Function<Filters, LinkedHashMap<String, Long>>() {
        @Override
        public LinkedHashMap<String, Long> apply(Filters term) {
            LinkedHashMap<String, Long> result = new LinkedHashMap<>();
            for (Filters.Bucket temp : term.getBuckets()) {
                MultiBucketsAggregation statisticTimeTerm = temp.getAggregations().get("Time");
                for (MultiBucketsAggregation.Bucket timeTemp : statisticTimeTerm.getBuckets()) {
                    result.put(timeTemp.getKeyAsString(), timeTemp.getDocCount());
                }
            }
            return result;
        }
    };

转化成lambda表达式后

    private Function<Filters , LinkedHashMap<String, Long>>  RESULT_CONVENT = term -> {
        LinkedHashMap<String, Long> result = new LinkedHashMap<>();
        for (Filters.Bucket temp : term.getBuckets()) {
            MultiBucketsAggregation statisticTimeTerm = temp.getAggregations().get("Time");
            for (MultiBucketsAggregation.Bucket timeTemp : statisticTimeTerm.getBuckets()) {
                result.put(timeTemp.getKeyAsString(), timeTemp.getDocCount());
            }
        }
        return result;
    };

这样写的目的就是转化成lambda表达式,转化为函数式编程思想,熟悉函数式接口 同样的下面的BiFunction功能更加强大,可以两个参数的计算转换

BiFunction两个参数的计算转换

public class function {
    static BiFunction<String, Integer, Boolean> expectLength = (s, num) -> s.length() == num;
    public static void main(String[] args) {
        System.out.print("BiFunction 示例, 字符串长度是否符合预期? " + expectLength.apply("21yi", 4));
    }
}

测试结果

在这里插入图片描述

到此这篇关于JAVA中的函数式接口Function和BiFunction详解的文章就介绍到这了,更多相关函数式接口Function和BiFunction内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文