1、何为Function接口?
在java8以后的接口可以有接口方法的默认实现了,上源代码。
@FunctionalInterface
public interface Function<T, R> {
//将参数赋予给相应方法,传入T,返回R
R apply(T t);
//先执行参数,再执行调用者 两个Function,先执行后面的,再执行前面的
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
//先执行调用者,再执行参数,和compose相反。先执行第一个fun1,再接着执行后面的fun2
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;
}
}
2、具体例子,上代码
apply 传入字符串,返回一个字符串
@Test
//传入参数字符串,返回参数字符串。字符串转大小写
public void functionApply () {
String result = typeConvert("wangjiesheng", s -> s.toUpperCase());
Console.log("function --> {}", result);
//function --> WANGJIESHENG
}
/***
* @Description: Function apply接口 传入一个参数,返回值一个参数
* @Author 王结胜 wangjiehseng
* @Date 2022/10/25 22:45
*/
public static <R> R typeConvert (String str, Function<String, R> function) {
R result = function.apply(str);
return result;
}
andThen 先执行fun1,再执行fun2
@Test
//先将字符串100转换未Integer类型,再Integer + 10得到结果 110
public void functionAndThen () {
Integer result = typeConvert("100", s -> Integer.parseInt(s), s2 -> (s2 + 10));
Console.log("function --> {}", result);
//function --> 110
}
/***
* @Description: 先执行fun1,再执行fun2 传入参数str
* @Author 王结胜 wangjiehseng
* @Date 2022/10/25 22:51
*/
public static <R> R typeConvert (String str, Function<String, Integer> fun1, Function<Integer, R> fun2) {
R result = fun1.andThen(fun2).apply(str);
return result;
}
compose 先执行fun2,再执行fun1 跟andThen相反
@Test
//先执行fun2 100*100 转换为String类型 再执行fun1把String转换为BigDecimal
public void functionCompose () {
BigDecimal amount= typeConvert2(100, s -> new BigDecimal(s), s2 -> String.valueOf(s2 * s2));
Console.log("function --> {}", amount);
//function --> 10000
}
/***
* @Description: 传入number 先执行fun2 Integer转String 再执行fun1 String 转泛型R
* @Author 王结胜 wangjiehseng
* @Date 2022/10/25 23:08
*/
public static <R> R typeConvert2 (Integer number, Function<String, R> fun1, Function<Integer, String> fun2) {
R result = fun1.compose(fun2).apply(number);
return result;
}
identity 数值为本身 s->s 替换为 Function.identity()
@Test
//把List转为Map, s->s 表示map的key值,key的数值为本身,可以简写为
public void identity () {
List<String> strings = Arrays.asList("abc", "de");
//Map<String, Integer> map = strings.stream().collect(Collectors.toMap(s->s, String::length));
Map<String, Integer> map = strings.stream().collect(Collectors.toMap(Function.identity(), String::length));
Console.log("function --> {}", map);
//function --> {de=2, abc=3}
}
Function函数式接口是java 8非常重要的特性,利用好Function函数可以极大的简化代码。
下面这篇文章中有介绍函数式接口主要分为Supplier供给型函数、Consumer消费型函数、Runnable无参无返回型函数和Function有参有返回型函数。