【发布时间】:2019-04-12 12:37:13
【问题描述】:
一个超级简单的问题:
这是我使用传统三元运算符 ? 的纯 Java 代码
public DateTime getCreatedAt() {
return !recordA.isPresent() ? recordB.get().getCreatedAt() : recordA.get().getCreatedAt();
}
我最好的选择是:
public DateTime getCreatedAt() {
return recordA.map(
record -> record.getCreatedAt())
.orElse(recordB.get().getCreatedAt());
}
这可以编译,但看起来它的行为不正确。
它总是执行两个分支,例如当recordA isPresent() 时,它仍然执行recordB.get().getCreatedAt() 这抛出了我
java.util.NoSuchElementException: No value present
感谢任何帮助!
基本上,我想用更高级的 Optional/lamda 功能替换传统的三元运算符。
【问题讨论】:
-
.orElseGet(() -> recordB.get().getCreatedAt());? -
你需要
orElseGet。您还可以使用两个选项和or()。 -
recordB也是可选的吗? -
看我的回答如果它是空的如何处理。
-
Optional不应该以这种方式使用。我的意思是,如果你愿意,你可以像这样使用它,毕竟它是你的代码 :) 但我的意思是,它不是为了替换三元运算符或 if/else 语句而设计的。它的主要用途是作为一个返回类型,在 youtube Stuart Marks 的会议上讨论这个话题。您可以像这样改进您的实际代码:return (recordA.isPresent() ? recordA : recordB).get().getCreatedAt()
标签: java lambda java-8 optional conditional-operator