【发布时间】:2018-09-12 15:16:39
【问题描述】:
我已经阅读过类似的帖子,但这是使用 computeIfAbsent 函数的正确方法吗? cookieMap 是一个 HashMap,response 是一个 Object,它包含所有的 headers、cookies、responses、status Code 等...
cookieMap.computeIfAbsent("Varlink", varLink -> {
if (responses.getCookie("VARLINK").length() < 1) {
throw new ProviderException("Varlink not present in response, check response status!!!");
}
return responses.getCookie("VARLINK");
});
我需要向 cookieMap 添加多个这样的键。我最初的想法是将所有内容都放在 If 条件中,但由于某些限制,我们不应该嵌套 if-else 条件(我猜 Code Reviewer 对 Clean Code 这本书太认真了)
【问题讨论】:
-
很难说。
cookieMap是什么?computeIfAbsent用于检索映射中的值,并在提供的键不存在值时提供初始化机制。 -
这是 HashMap
-
它是如何使用的,它的意义/相关性是什么?为什么要使用 computeIfAbsent?是否有可能存在价值?
-
假设
cookieMap和respones是不同的map,这样使用没有问题,但是建议将respones.getCookie("VARLINK")的结果存入一个局部变量,而不是求值相同表达两次。此外,您可以考虑将 lambda 主体的代码移动到命名方法中(这将使大多数代码审阅者感到高兴)并在computeIfAbsent中使用方法引用或简单的varLink -> expressionlambda 表达式。 -
@Holger 感谢您的回答。
responses是一个对象,其中包含请求的所有 cookie、标头和响应。我最后做的是cookieMap.put("VARLINK", Preconditions.checkNotNull(respones.getCookie("VARLINK"), "Varlink not present in Response, check Response status!!!"));原来response对象返回一个null如果密钥不存在。