0

0

构建灵活的函数:使用 Builder 模式处理函数或浮点数参数

霞舞

霞舞

发布时间:2025-08-19 17:08:01

|

480人浏览过

|

来源于php中文网

原创

构建灵活的函数:使用 builder 模式处理函数或浮点数参数

使用 Builder 模式处理函数或浮点数参数

在编写需要灵活配置参数的函数时,我们经常会遇到这样的需求:某些参数既可以接受一个具体的数值,也可以接受一个函数,该函数根据输入动态地计算出数值。如果直接使用方法重载,会导致大量的重复代码,难以维护。本文将介绍如何使用 Builder 模式来解决这个问题,提供一种更优雅、更灵活的解决方案。

Builder 模式简介

Builder 模式是一种创建型设计模式,它将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。简单来说,Builder 模式允许我们一步一步地构建一个对象,而不是一次性地将所有参数传递给构造函数。这在参数数量较多,且部分参数可选的情况下非常有用。

实现 RangeBuilder

假设我们需要创建一个 RangeBuilder 类,用于生成一个函数,该函数接受一个 PVector 对象作为输入,并返回一个 Double 值。该函数的核心逻辑是根据输入的 PVector 对象,结合 scale、min 和 max 三个参数,计算出一个映射后的值。这三个参数都可以是 Double 类型的数值,也可以是一个 Function 函数。

下面是 RangeBuilder 类的代码实现:

import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;
import java.io.IOException;

class PVector {
    public double x;
    public double y;

    public PVector(double x, double y) {
        this.x = x;
        this.y = y;
    }
}

public 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));
    }

    // Mock noise and map functions for demonstration
    private double noise(double x, double y) {
        // Replace with your actual noise function implementation
        return (Math.sin(x) + Math.cos(y)) / 2.0; // Example noise function
    }

    private double map(double value, double start1, double stop1, double start2, double stop2) {
        return start2 + (stop2 - start2) * ((value - start1) / (stop1 - start1));
    }

    public static void main(String... args) throws IOException {
        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());

        s.forEach(System.out::println);
        s2.forEach(System.out::println);

    }

}

代码解释:

Sail!企业网站管理系统简体中文版1.2
Sail!企业网站管理系统简体中文版1.2

Sail企业网站管理系统(以下称Sail)是一个基于PHP+Mysql架构的企业网站管理系统。Sail 采用模块化方式开发,功能强大灵活易于扩展,并且完全开放源代码,面向大中型站点提供重量级企业网站建设解决方案。2年来,凭借Silence长期积累的丰富的Web开发及数据库经验和勇于创新追求完美的设计理念,使得Sail得到了很多公司和网站的认可,并且越来越多地被应用到大中型商业网站主要功能:单页、文

下载
  1. 成员变量: scale、min 和 max 都是 Function 类型的成员变量,用于存储对应的函数。
  2. Builder 方法: scale(Function scale)、min(Function min) 和 max(Function max) 方法用于设置对应的函数。这些方法都返回 RangeBuilder 实例本身,以便链式调用。
  3. 重载方法: scale(double scale)、min(double min) 和 max(double scale) 方法是重载方法,用于直接设置数值。这些方法内部调用了对应的函数设置方法,并将数值包装成一个简单的 Lambda 表达式 in -> scale,从而将数值转换为函数。
  4. build() 方法: build() 方法用于构建最终的函数。该方法返回一个 Function 对象,该对象内部使用了 scale、min 和 max 三个函数来计算最终的映射值。
  5. main() 方法: main() 方法展示了如何使用 RangeBuilder 类来构建用于 Stream 的函数。通过链式调用 scale()、min() 和 max() 方法,可以灵活地配置参数。

使用示例

以下代码展示了如何使用 RangeBuilder 类来构建函数,并将其应用于 Stream:

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());

在这个例子中,s 和 s2 都是 Stream 类型的 Stream。s 使用了固定的数值作为 scale、min 和 max 参数,而 s2 使用了一个嵌套的 RangeBuilder 来生成 scale 参数。

总结

使用 Builder 模式可以有效地解决函数参数既可以是数值,也可以是函数的问题。通过将数值包装成 Lambda 表达式,可以统一参数类型,避免代码重复。Builder 模式还提供了更灵活的 API 设计,使得我们可以一步一步地配置参数,从而提高代码的可读性和可维护性。在实际应用中,可以根据具体的需求,灵活地调整 Builder 类的实现方式,以满足不同的场景。

相关专题

更多
c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

46

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

92

2025.10.23

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

200

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

187

2025.11.08

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

467

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

158

2023.10.07

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

115

2025.12.24

拼豆图纸在线生成器
拼豆图纸在线生成器

拼豆图纸生成器有PixelBeads在线版、BeadGen和“豆图快转”;推荐通过pixelbeads.online或搜索“beadgen free online”直达官网,避开需注册的诱导页面。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

84

2025.12.24

俄罗斯搜索引擎yandex官方入口地址(最新版)
俄罗斯搜索引擎yandex官方入口地址(最新版)

Yandex官方入口网址是https://yandex.com。用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

553

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.8万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号