假设我们有 boolean 标志来打开/关闭流中的 map 。例如是否修剪。
下面的示例是正确的解决方案还是有更好的方法来实现?
boolean doTrim = true;
optionalValue.map(doTrim ? String::trim : (x) -> x ).get()...
或者:
boolean doTrim = true;
optionalValue.map(doTrim ? String::trim : Function.identity() ).get()...
最佳答案
你把事情搞得太复杂了。如果您有Optional<String> optionalValue
你可以简单地说:
if(doTrim) optionalValue=optionalValue.map(String::trim);
然后继续,例如调用get
就在上面。
但是如果您调用get()
无条件地就像你的例子一样,你必须相信 Optional
不是,可选,但是存在。如果您知道 String
存在,您可以做得更简单:
String s=optionalValue.get();
if(doTrim) s=s.trim();
如果您坚持将所有代码内联,当然可以这样写:
(doTrim? optionalValue: optionalValue.map(String::trim)).get()
或
(doTrim? optionalValue.get(): optionalValue.get().trim())
但与普通的if
相比并没有真正的优势在此声明。如果您有一个真正的可选值,不知道是否 String
在场,但不想调用 get
立即,我会推荐我的答案的第一个版本,因为它允许继续Optional
以任何你喜欢的方式。您可以在 String::trim
之间进行选择恒等函数可能看起来更时髦,但与传统编程相比并没有真正的优势。
关于Java 8 条件 .map() (或带有恒等函数的映射),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27315959/