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运行时将在后台创建一个对象,该对象与任何其他对象一样,会消耗内存并花费时间进行分配和垃圾收集)