假设我有这样的代码


@FunctionalInterface
interface Callable {
    Integer multiply(Integer by);
}

class Builder {
    private Integer multiplier;

    public Builder multiplyBy(Integer multiplier) {
        this.multiplier= multiplier;
        return this;
    }

    public Callable build() {
        return (value) -> value * multiplier; //how to "bake" hever value
    }
}

// calling

Builder builder;
Callable multiplierBy3 = builder.multiplyBy(3);
Callable multiplierBy6 = builder.multiply(6);

multiplierBy3.multiply(10); //should return 30, returns 60
multiplierBy6.multiply(10); // return 60, ok, propably because of new multipier value

之所以发生这种行为,是因为第二次调用multiplyBy会在Builder中设置新的value. 我如何才能创建每个lambda自己的乘数函数?

推荐答案

就像@Kayaman说的那样:

使用两个构建器,这就是您要维护lambda状态的地方.

因此,解决方案是这样的:

Builder builderBy3 = new Builder();
Builder builderBy6 = new Builder();

Callable multiplierBy3 = builderBy3.multiplyBy(3).build();
Callable multiplierBy6 = builderBy6.multiplyBy(6).build();

System.out.println(multiplierBy3.multiply(10)); // Returns 30
System.out.println(multiplierBy6.multiply(10)); // Returns 60

但您也可以修改Builder:

class Builder {
    private Integer multiplier;

    public Builder multiplyBy(Integer multiplier) {
        this.multiplier = multiplier;
        return this;
    }

    public Callable build() {
        int currentMultiplier = this.multiplier; // Current multiplier value
        return (value) -> value * currentMultiplier; // Use it in the lambda
    }
}

然后,您可以执行以下操作:

Builder builder = new Builder();

Callable multiplierBy3 = builder.multiplyBy(3).build();
Callable multiplierBy6 = builder.multiplyBy(6).build();

System.out.println(multiplierBy3.multiply(10)); // Returns 30
System.out.println(multiplierBy6.multiply(10)); // Returns 60

Java相关问答推荐

虚拟线程似乎在外部服务调用时阻止运营商线程

为什么如果数组列表中有重复项,我的代码SOMETIMES不返回true?

如何在SystemiccationRetryListenerSupport中获得类级别的spring retryable annotation中指定的标签?

Java Stream,需要更新列表对象列表

Java自定义ThreadPool—暂停任务提交并取消当前排队任务

将数组整体转换为链接表

使用动态ID从json获取详细信息的Jolt规范

多重延迟签名

格式中的特定回录键-值对

使用Room Database删除Jetpack合成中的所有项目后,UI未重新合成

如何在 spring 数据的MongoDB派生查询方法中使用$EXISTS

如何在JavaFX循环中完美地制作一个AudioClip/MediaPlayer?

二进制数据的未知编码/序列化

无法使用Java PreparedStatement在SQLite中的日期之间获取结果

为了安全起见,有必要复制一份 list 吗?

基于Java中mm/dd/yy格式的最近日期对数组列表进行排序

如何在右击时 Select 新行?

如何使用Rascal Evaluator从编译的JAR访问Rascal函数?

Android上的SQLite:Android.database.SQLite.SQLiteReadOnlyDatabaseException:try 写入只读数据库(代码1032 SQLite_readonly_DBMOVED)

如何使用我的RLE程序解决此问题