函数式接口中Function ,BiFunction计算转换接口是什么
Function和BiFunction属于函数式接口,那么什么是函数式接口呢?
函数式接口
只有一个抽象方法的接口我们称之为函数接口。
JDK的函数式接口都加上了@FunctionalInterface注解进行标识。但是无论是否加上该注解只要接口中只有一个抽象方法,都是函数式接口。
为什么要用函数式接口
- 代码简洁,开发快速
- 可以使用极简的lambda表达式实例化接口
其实就是为了适应转化成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)); } }
测试结果