如何为含Function属性的FunctionCompose类实现flatMap方法?
实现FunctionCompose的flatMap方法
这里是完成flatMap方法实现后的完整代码:
import java.util.function.Function; class FunctionCompose<T, R> { public final Function<T, R> function; public FunctionCompose(Function<T, R> function) { this.function = function; } public <U> FunctionCompose<T, U> map(Function<? super R, ? extends U> mapper) { return new FunctionCompose<>(function.andThen(mapper)); } public <U> FunctionCompose<T, U> flatMap(Function<? super R, ? extends FunctionCompose<? super R, ? extends U>> mapper) { Function<T, U> combinedFunction = t -> { R result = function.apply(t); return mapper.apply(result).apply(result); }; return new FunctionCompose<>(combinedFunction); } public R apply(T smth) { return function.apply(smth); } }
实现说明
泛型与参数设计
<U>是flatMap最终返回结果的类型- 方法参数
mapper使用Function<? super R, ? extends FunctionCompose<? super R, ? extends U>>,遵循PECS原则:? super R允许mapper接收R的父类类型参数,提升兼容性? extends FunctionCompose<? super R, ? extends U>允许mapper返回FunctionCompose的子类,且其输入可接受R的父类、输出可为U的子类
核心逻辑
- 先通过原
function将输入t转换为R类型结果 - 用该结果调用
mapper,得到一个新的FunctionCompose实例 - 调用这个新实例的
apply方法处理之前的R类型结果,得到最终的U类型值 - 将整个逻辑包装为
Function<T, U>,创建新的FunctionCompose返回
- 先通过原
验证示例
用你提到的场景测试:
public class Test { public static void main(String[] args) { // String转Integer的FunctionCompose(取字符串长度) FunctionCompose<String, Integer> stringToInt = new FunctionCompose<>(String::length); // flatMap传入Integer->FunctionCompose<Integer, Integer>(将输入值乘2) FunctionCompose<String, Integer> composed = stringToInt.flatMap(i -> new FunctionCompose<>(x -> x * 2)); // 输出:10("hello"长度为5,5*2=10) System.out.println(composed.apply("hello")); } }
内容的提问来源于stack exchange,提问作者SendHelp
相关产品推荐
相关产品推荐

