假设我正在使用选项,并且我有:
A a;
....
Optional.ofNullable(a)
.map(A::getB)
.map(B::getC)
.ifPresent(c -> ...) // do something with c
但是,如果出于某种原因,我想在 B::getC 为空(或 a 为空)时记录。有一些成语来处理这个问题吗?我可以做一堆嵌套的 ifPresent 调用,但这非常冗长。
我能想到的最好的方法是一个 FunctionalHelper 类,它包装了一些 Optional 方法并添加了其他方法来支持日志记录(log4j):
private static final Logger LOG = //...
private static final FunctionalHelper FH
= new FunctionalHelper(LOG, Level.DEBUG);
FH.ofNullable(a, Level.WARN, "You gave me a null A"))
.map(FH.logNull(A::getB, "b was null for a: {}", a-> FH.args(a.getName()))
.map(B::getC)
.ifPresent(c -> ...) // do something with c
它有效,但感觉有点像一个螺栓固定的解决方案。是否有一些成语(或至少是标准库)来处理这种事情?
(我也想知道如何干净地处理链中抛出的检查异常,但也许这是一个单独的问题。)
更新:作为对@Ole VV 的回应,这里是可选的示例(更新2:我对其进行了一些调整以匹配 log4j varags 供应商语义,但具有功能:
private static final FunctionalHelper FH = new FunctionalHelper(LOG, Level.DEBUG);
void foo(A someA) {
FH.ofNullable(someA, Level.WARN, "You gave me a null A")
.map(FH.logNull(A::getB, "B was null for A: {}", A::getName))
.map(FH.logNull(B::getC, "C was null for B: {}", B::getName))
.ifPresent(c -> { /* do something with c */});
}
这是一个 If-else 实现:
void foo2(A a) {
if (a == null) LOG.debug("You gave me a null A");
else {
B b = a.getB();
if (b == null) LOG.debug("B was null for a: {}", a::getName);
else {
String c = b.getC();
if (c == null) LOG.debug("C was null for a: {}", b::getName);
else { /* do something with c */ }
}
}
}
我会说前者更容易阅读。也更容易修改现有的可选链以在需要时添加一些东西。
桃花长相依
心有法竹
慕勒3428872
暮色呼如
相关分类