Java 如何实现ComputeFabSent以返回对象值?

Java 如何实现ComputeFabSent以返回对象值?,java,function,collections,Java,Function,Collections,我已经编写了一个方法,该方法使用某个字段的名称,如果它是一个基本字段,则会计算该字段的值,并将其放入键的映射中 private final Map<String, Object> valuesMap = new HashMap<>(); private void saveValues(String name) { if (dataStore.isEssentialField(name)) { valuesMap.put(name, calcula

我已经编写了一个方法,该方法使用某个字段的名称,如果它是一个基本字段,则会计算该字段的值,并将其放入键的映射中

private final Map<String, Object> valuesMap = new HashMap<>();

private void saveValues(String name) {
    if (dataStore.isEssentialField(name)) {
        valuesMap.put(name, calculateValue(name));
    }
}

可以按如下方式使用Lambda函数:

private Object saveValues(String name) {
    if (dataStore.isEssentialField(name)) {
        return valuesMap.computeIfAbsent(name, this::calculateValue);
    }
    return valuesMap.get(name);
}
更经典的方法是:

private Object saveValues(String name) {
    Object storedValue = valuesMap.get(name);
    if (dataStore.isEssentialField(name)) {
        if (storedValue != null) {
            return storedValue;
        }
        storedValue = calculateValue(name);
        valuesMap.put(name, storedValue);
    }
    return storedValue;
}

可以按如下方式使用Lambda函数:

private Object saveValues(String name) {
    if (dataStore.isEssentialField(name)) {
        return valuesMap.computeIfAbsent(name, this::calculateValue);
    }
    return valuesMap.get(name);
}
更经典的方法是:

private Object saveValues(String name) {
    Object storedValue = valuesMap.get(name);
    if (dataStore.isEssentialField(name)) {
        if (storedValue != null) {
            return storedValue;
        }
        storedValue = calculateValue(name);
        valuesMap.put(name, storedValue);
    }
    return storedValue;
}

如果已经有一个值与“name”键关联,或者该键不是“essentialField”,则该方法必须返回现有值。如果密钥不是必需的,并且没有现有值,该怎么办?
返回datastore.get(name)
@GPI在键不是必需的并且没有现有值的情况下,可能唯一的选择是返回
null
。您的需求中有一个漏洞“如果已经有一个值与“name”键关联,或者键不是“essentialField”,则该方法必须返回现有值”。如果密钥不是必需的,并且没有现有值,该怎么办?
返回datastore.get(name)
@GPI在键不重要且没有现有值的情况下,可能唯一的选择是返回
null
。您能告诉我
s
在您之前的编辑
返回值map.computeIfAbsent(name,s->calculateValue(name))中的意思吗?应该是
返回值map.computeFabSent(名称->计算值)。Lambda只是调用代码的一种简单方法。在这个场景中,编译器知道我们正在处理一个
接口
,它只有一个要实现的方法(称为
apply(…);
s->calculateValue
创建一个
新函数
,并使用
calculateValue
实现单一方法,其中
s
apply(T)中的单一参数
this::calculateValue
只是进一步推动了这一步,并抛弃了参数,因为编译器知道我们的实现中有一个参数,还有一个参数传递给
calculateValue(…)
。在这种情况下,您可以像我上面所做的那样编写它(尽管您应该知道java运行时将在后台创建一个像任何其他对象一样消耗内存、分配和垃圾收集时间的对象),您能告诉我
s
在上一次编辑
返回值map.computeFabSent中的意思吗(name,s->calculateValue(name));
?这应该是
返回值map.computeIfAbsent(name,s->calculateValue(s));
。Lambda只是调用代码的一种简短方式。在这种情况下,编译器理解我们正在处理的
接口
,它只有一个要实现的方法(称为
apply”)(…);
)。
s->calculateValue
创建一个
新函数
,并使用
calculateValue
实现单个方法,其中
s
apply(T)中的单个参数;
this::calculateValue
只需进一步推动这一步,并抛弃参数,因为编译器知道我们的实现中有一个参数,还有一个参数被传递到
calculateValue(…)
。在这种情况下,您可以像上面那样编写它(尽管您应该知道java运行时将在后台创建一个对象,该对象与任何其他对象一样,会消耗内存并花费时间进行分配和垃圾收集)