Java中Fuction函数式接口的使用
java.util.Function是Java8新增的函数式接口所谓的函数式接口就是接口内部有且仅有一个抽象方法而Function的特性是约束了入参和出参数据类型的规则FunctionalInterfacepublicinterfaceFunctionT,R{//基础方法:需要自己实现转换逻辑 接收T类型参数返回R类型结果Rapply(Tt);//前置组合//执行顺序: 先执行 入参before.apply(v) - 再执行当前接口的 apply()defaultVFunctionV,Rcompose(Function?superV,?extendsTbefore){Objects.requireNonNull(before);return(Vv)-apply(before.apply(v));}//后置组合//执行顺序: 先执行当前接口的 apply(t) - 再执行 after.apply()defaultVFunctionT,VandThen(Function?superR,?extendsVafter){Objects.requireNonNull(after);return(Tt)-after.apply(apply(t));}//静态恒等方法输入值直接原样返回 t - tstaticTFunctionT,Tidentity(){returnt-t;}}1、apply方法使用packagecn.aopmin.function;importcn.hutool.core.util.StrUtil;importjava.util.function.Function;/** * java.util.function.Function#apply方法的使用 * 示例将字符串转数字 * * author aopmin * since 2026/7/8 */publicclassFunctionDemo1{publicstaticvoidmain(String[]args){testApply();}publicstaticvoidtestApply(){FunctionString,IntegerfunctionnewFunction(){OverridepublicIntegerapply(Strings){// 判断是否为数字字符串非数字返回nullif(StrUtil.isNumeric(s)){returnInteger.parseInt(s);}returnnull;}};System.out.println(function.apply(123));System.out.println(function.apply(abc));}}2、链式组合compose方法的使用packagecn.aopmin.function;importcn.hutool.core.util.StrUtil;importjava.util.function.Function;/** * java.util.function.Function#compose前置组合 * 示例数字字符串带前后空格先去空格再转数字 * author aopmin * since 2026/7/8 */publicclassFunctionDemo2{publicstaticvoidmain(String[]args){testCompose();}/** * compose当自身Function调用compose方法后先执行传入的before前置函数再执行自身Function#apply */publicstaticvoidtestCompose(){FunctionString,IntegerstrToInts-StrUtil.isNumeric(s)?Integer.parseInt(s):-1;FunctionString,StringtrimFuncStrUtil::trim;Stringsource 666 ;IntegerresultstrToInt.compose(trimFunc).apply(source);System.out.println(testCompose 带空格字符串转换结果result);// 对比不使用compose的情况IntegerwithoutComposestrToInt.apply(source);System.out.println(不使用compose直接转换withoutCompose);}}3、链式组合andThen方法的使用packagecn.aopmin.function;importcn.hutool.core.util.StrUtil;importjava.util.function.Function;/** * java.util.function.Function#andThen 后置组合 * 示例先转数字再乘10 * author aopmin * since 2026/7/8 */publicclassFunctionDemo3{publicstaticvoidmain(String[]args){testAndThen();}/** * andThen自身执行完再执行后置函数 */publicstaticvoidtestAndThen(){FunctionString,IntegerstrToInts-StrUtil.isNumeric(s)?Integer.parseInt(s):null;FunctionInteger,Integermul10n-n*10;FunctionString,IntegerchainstrToInt.andThen(mul10);System.out.println(testAndThenchain.apply(8));}}4、FunctionMap实现简单策略packagecn.aopmin.function;importcn.hutool.core.util.StrUtil;importjava.util.HashMap;importjava.util.Map;importjava.util.function.Function;/** * Function Map 简化策略模式 * 示例实现简单数学运算 * author aopmin * since 2026/7/8 */publicclassFunctionDemo4{// 全局策略Mapkey策略类型valueFunction策略privatestaticfinalMapString,FunctionInteger,StringSTRATEGY_MAP;// 静态初始化加载所有策略static{STRATEGY_MAPnewHashMap();// 策略1加5STRATEGY_MAP.put(add5,num-加法结果(num5));//使用lambda简化匿名内部类的写法// 策略2乘10STRATEGY_MAP.put(multiply10,num-乘法结果(num*10));// 策略3平方STRATEGY_MAP.put(square,num-平方结果(num*num));}/** * 统一策略执行入口 * * param type 策略标识 * param num 待计算数字 * return 处理后文本 */publicstaticStringexecuteStrategy(Stringtype,Integernum){// 根据key获取对应Function策略不存在给默认兜底策略FunctionInteger,StringfuncSTRATEGY_MAP.getOrDefault(type,n-未知操作原值n);returnfunc.apply(num);}publicstaticvoidmain(String[]args){// 测试不同策略System.out.println(executeStrategy(add5,10));System.out.println(executeStrategy(multiply10,10));System.out.println(executeStrategy(square,10));// 不存在的策略兜底System.out.println(executeStrategy(minus,10));}}