- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 Optional 来处理空值,我想不出什么是最好的方法的“棘手”部分是我想在值为空时进行日志记录。我可以通过以下代码实现这一点 - 但感觉很尴尬。
(更新:我已经发布了我自己的答案,来自 Java 9 的 Optional)
假设代码如下所示:
// logLine.getSomeProperty returns Optional<String>
List<LogDetails> logDetails = logLine.getSomeProperty()
.map(this::extractLogDetails)
.orElseGet(() -> logError(logLine));
List<LogDetails> extractLogDetails(String s) {
List<LogDetails> logDetails = new ArrayList<>();
String sp = "(?:([A-Z0-9]{5,7})-([A-Z0-9]{9})-(.{4}))";
Pattern p = Pattern.compile(sp, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(s);
while (m.find()) {
logDetails.add(new LogDetails(m.group(1), m.group(2), m.group(3)));
}
return logDetails;
}
List<LogDetails> logError(LogLine logLine) {
log.error("Error while ... {} ", logLine));
persistence.setErrorStatus(logLine, FAILED_PARSING);
return new ArrayList<>();
}
它会做我想做的事,但我有几个“问题”。
orElseGet
的方法用于日志记录错误。logDetails.size() == 0
最佳答案
orElseGet
并不是真正的错误处理机制,而是一种在 Optional
实例不携带任何值的情况下生成不同默认值的方法。
如果您想检查 Optional
是否为空,只需使用 Optional.isPresent()
检查,然后执行 logError()
在这种情况下。
你首先要考虑的是,如果Optional
为空,你想做什么?除了记录错误之外,您还想继续使用空列表吗?
如果是,那么你可以有这样的东西:
List<LogDetails> logDetails = logLine.getSomeProperty()
.map(this::extractLogDetails)
.orElseGet(Collections::emptyList);
之后你可以做:
if (logDetails.isEmpty()) {
logError(logline);
}
或者,如果您根本不想有一个空列表,您可以将内容保持在可选级别。这样,getSomeProperty()
为空或生成的列表为空的两种情况都以相同的方式处理。
Optional<List<LogDetails>> logDetailsOpt = logLine.getSomeProperty()
.map(this::extractLogDetails)
.filter(list -> !list.isEmpty());
if (!logDetailsOpt.isPresent()) {
logError(logLine);
}
在这两种情况下,logError()
都不应返回任何内容。它正在以其名称做它打算做的事情,记录错误。
与其尝试过度使用 Optional
的功能,不如尝试在代码中明确说明您的意图。可读性更有值(value)。
关于java - 使用 Optional.orElseGet 做一些日志记录逻辑是个好主意吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54272680/
这个问题在这里已经有了答案: Get value from one Optional or another (5 个答案) Optional orElse Optional in Java (6 个
我不确定如何准确地提出这个问题,所以请耐心等待... 1) 除了添加 null 之外,是否有更好(又名更“正确”)的方法来实例化可选元素的 Stream然后过滤掉 null 的? Stream.of(
我想使用 Optional 来处理空值,我想不出什么是最好的方法的“棘手”部分是我想在值为空时进行日志记录。我可以通过以下代码实现这一点 - 但感觉很尴尬。 (更新:我已经发布了我自己的答案,来自 J
你好,我在这里做错了什么 我想获取基础 Id ,如果它不存在,则获取保险类型..代码片段粘贴在下面..但我在 orElse 部分收到错误,我什至尝试过 orElseGet() ...它说“Lambda
这个问题已经有答案了: Difference between `Optional.orElse()` and `Optional.orElseGet()` (9 个回答) When I need to
我准备了一个小例子来复制我的项目中发生的事情。我知道如何解决它,但我很好奇为什么它甚至无法编译。当我在方法 public TestElement test() 中使用通用通配符时,问题出在最后一次返回
我有一个可选的类列表,即:Optional> opListEntity 我需要映射所有 MyEntity至MyEntityDto当可选存在时。如果 Optional 为空,我将返回一个空的 Array
我需要对此有一个明确的解释,即使我读过这个 link关于差异但没有明确说明。那么任何人都可以用代码简单地向我解释一下吗? 最佳答案 我想我开始理解你的问题了。 Optional 的执行顺序可能与我们在
我有一个用于形成 JSON 响应的类 TeamResponse。它有一些参数,其中一个是可选的: public TeamResponse(Team team, List teamSkillTempla
这个问题在这里已经有了答案: Difference between `Optional.orElse()` and `Optional.orElseGet()` (9 个回答) 关闭 3 年前。 我
我在使用 Groovy 2.4.16 和 Java 8.0.212-zulu 以及 java.util.Optional 时遇到了奇怪的行为。 所以,这是代码: def optRegion = new
Java9 给 Optional 添加了 .or 方法。现有的 .orElseGet 有何不同? checkUserInMemory(userId).or(() -> checkUserInDB(us
假设我不知道一个 Optional 是否为空,或者两者是否都存在。在后一种情况下,我总是希望 a 而不是 b: final Optional a = Optional.of("1"); final O
这个问题在这里已经有了答案: Difference between `Optional.orElse()` and `Optional.orElseGet()` (9 个回答) 关闭 4 年前。 这
我是一名优秀的程序员,十分优秀!