
本文介绍如何使用 Builder 模式来构建一个接受 Function 或 Float/Double 作为参数的函数,用于流式处理。通过 Builder 模式,可以避免方法重载带来的代码冗余,并提供一种优雅的方式来处理动态类型的输入,从而简化创意编码应用中的参数配置。
在函数式编程中,我们经常需要构建接受不同类型参数的函数。当参数类型可能是 Function 或基本类型(如 Float 或 Double)时,直接使用方法重载会导致大量的重复代码。一种更优雅的解决方案是使用 Builder 模式。Builder 模式允许我们逐步构建对象,并在构建过程中处理不同类型的参数。
以下是一个使用 Builder 模式的示例,用于构建一个名为 RangeBuilder 的类,该类可以接受 Function
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;
public class RangeBuilderExample {
public static void main(String... args) {
List pvs = List.of(new PVector(0, 0));
Stream s = pvs.stream().map(new RangeBuilder().scale(.02)
.min(0)
.max(255)
.build());
Stream s2 = pvs.stream().map(new RangeBuilder().scale(new RangeBuilder().scale(.02)
.min(.1)
.max(.002)
.build())
.min(0)
.max(255)
.build());
}
public static final class RangeBuilder {
private Function scale;
private Function min;
private Function max;
public RangeBuilder scale(Function scale) {
this.scale = scale;
return this;
}
public RangeBuilder scale(double scale) {
return scale(in -> scale);
}
public RangeBuilder min(Function min) {
this.min = min;
return this;
}
public RangeBuilder min(double min) {
return min(in -> min);
}
public RangeBuilder max(Function max) {
this.max = max;
return this;
}
public RangeBuilder max(double scale) {
return max(in -> scale);
}
public Function build() {
return pv -> map(noise(pv.x * scale.apply(pv), pv.y * scale.apply(pv)), 0, 1, min.apply(pv), max.apply(pv));
}
// 模拟 noise 和 map 函数
private double noise(double x, double y) {
// 实际应用中需要替换为真正的噪声函数
return Math.random();
}
private double map(double value, double start1, double stop1, double start2, double stop2) {
return start2 + (stop2 - start2) * ((value - start1) / (stop1 - start1));
}
}
// 模拟 PVector 类
private static class PVector {
public double x;
public double y;
public PVector(double x, double y) {
this.x = x;
this.y = y;
}
}
} 代码解释:
RangeBuilder 类: 这是一个静态内部类,负责构建最终的 Function
对象。 参数字段: scale、min 和 max 都是 Function
类型,它们代表了缩放比例、最小值和最大值。 -
Builder 方法: 每个参数都有两个重载的 Builder 方法:
成新网络商城购物系统下载使用模板与程序分离的方式构建,依靠专门设计的数据库操作类实现数据库存取,具有专有错误处理模块,通过 Email 实时报告数据库错误,除具有满足购物需要的全部功能外,成新商城购物系统还对购物系统体系做了丰富的扩展,全新设计的搜索功能,自定义成新商城购物系统代码功能代码已经全面优化,杜绝SQL注入漏洞前台测试用户名:admin密码:admin888后台管理员名:admin密码:admin888
- 接受 Function
作为参数,直接设置对应的字段。 - 接受 double 作为参数,创建一个返回该 double 值的 Function
,并设置对应的字段。例如,scale(double scale) 方法会创建一个 in -> scale 的 lambda 表达式,并将其赋值给 scale 字段。
- 接受 Function
build() 方法: 该方法将所有参数组合起来,创建一个最终的 Function
对象。在这个例子中,它使用了 map 函数和 noise 函数(这里只是模拟,实际应用中需要替换为真正的实现)来计算最终的结果。
使用示例:
在 main 方法中,我们创建了两个 Stream
注意事项:
- 在实际应用中,需要根据具体的需求来实现 noise 和 map 函数。
- 可以选择使用 double 类型代替 float 类型,因为 double 是 Java 中浮点数的默认类型,精度更高。
- Builder 模式可以有效地避免方法重载带来的代码冗余,并提供一种灵活的方式来处理不同类型的参数。
总结:
通过使用 Builder 模式,我们可以构建灵活的、可配置的函数,这些函数可以接受不同类型的参数,并避免代码冗余。这种模式在函数式编程中非常有用,特别是在需要处理动态类型的输入时。 本教程提供了一个简单的示例,展示了如何使用 Builder 模式来构建一个接受 Function 或 Double 作为参数的函数。 您可以根据自己的实际需求来扩展和修改这个示例。










