Java 8动态调用函数:基于Builder模式构建复杂处理函数的问询
哇,这个思路真的很巧妙!Builder模式可不只是用来构建实体对象的,用它来组装复杂的处理函数链完全可行,刚好能解决你说的“获取字符串列表后选择性应用若干函数”的需求。我给你梳理下具体的实现思路和代码示例吧:
用Builder模式构建复杂处理函数的方案
核心思路
我们要做的是用Builder来一步步组装处理步骤,最后生成一个整合了所有步骤的“超级函数”——这个函数会先拿到数据源的字符串列表,然后依次执行你添加的所有辅助处理函数。本质上是把Builder模式的“构建对象”改成“构建执行流程”,完全贴合你的需求。
代码示例(以Java为例)
先写一个StringProcessorBuilder,它负责管理处理步骤,最后输出最终的处理函数:
import java.util.ArrayList; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; public class StringProcessorBuilder { // 存储所有要执行的处理函数 private final List<Function<List<String>, List<String>>> processors = new ArrayList<>(); // 添加修剪字符串的步骤 public StringProcessorBuilder addTrimmer() { processors.add(strings -> strings.stream() .map(String::trim) .collect(Collectors.toList())); return this; // 链式调用,方便连续添加步骤 } // 添加过滤空字符串的步骤 public StringProcessorBuilder addEmptyFilter() { processors.add(strings -> strings.stream() .filter(s -> !s.isBlank()) .collect(Collectors.toList())); return this; } // 自定义处理步骤的通用方法,想加啥逻辑都可以 public StringProcessorBuilder addCustomProcessor(Function<List<String>, List<String>> processor) { processors.add(processor); return this; } // 构建最终的处理函数 public Function<List<String>, List<String>> build() { // 初始函数:直接返回输入列表(作为流程起点) Function<List<String>, List<String>> finalProcessor = input -> input; // 把所有处理步骤依次串起来 for (Function<List<String>, List<String>> step : processors) { finalProcessor = finalProcessor.andThen(step); } return finalProcessor; } }
然后是使用示例,模拟你的场景:
public class Demo { // 模拟从数据源获取字符串列表 private static List<String> getStringsFromSource() { return List.of(" hello ", "", "world ", " builder pattern "); } public static void main(String[] args) { // 按需组装处理流程:修剪→过滤空→转大写 var myProcessor = new StringProcessorBuilder() .addTrimmer() .addEmptyFilter() .addCustomProcessor(strings -> strings.stream() .map(String::toUpperCase) .collect(Collectors.toList())) .build(); // 执行:先拿数据源,再用组装好的函数处理 List<String> result = myProcessor.apply(getStringsFromSource()); System.out.println(result); // 输出: [HELLO, WORLD, BUILDER PATTERN] } }
为啥这符合Builder模式?
- 构建和使用分离:你只需要告诉Builder要加哪些处理步骤,不用关心这些步骤是怎么被整合到最终函数里的
- 灵活可扩展:要加新的处理逻辑,要么给Builder加个新的
addXXX()方法,要么直接用addCustomProcessor()传自定义函数就行 - 可读性拉满:链式调用的写法一眼就能看出来处理流程是啥,比一堆嵌套函数好懂多了
如果想把“获取数据源”也整合到最终函数里,只需要改下build()方法,让它返回一个Supplier:
public Supplier<List<String>> buildWithSource() { Function<List<String>, List<String>> finalProcessor = input -> input; for (var step : processors) { finalProcessor = finalProcessor.andThen(step); } return () -> finalProcessor.apply(getStringsFromSource()); }
这样调用的时候直接myProcessor.get()就能拿到处理后的结果了!
内容的提问来源于stack exchange,提问作者Zachary Hamm
相关产品推荐
相关产品推荐

