假设我们有布尔标志来打开/关闭流中的地图。例如要修剪或不修剪。
下面的示例是正确的解决方案还是有更好的方法来实现它?
boolean doTrim = true;
optionalValue.map(doTrim ? String::trim : (x) -> x ).get()...
或:
boolean doTrim = true;
optionalValue.map(doTrim ? String::trim : Function.identity() ).get()...
答案 0 :(得分:1)
你的事情过于复杂。如果你有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
和身份函数之间进行选择的变体可能看起来更加时髦,但与传统编程相比没有任何优势。
答案 1 :(得分:0)
两个观点:
从Java语言角度来看
两者都相同。
从JVM字节码指令角度来看
他们是不同的。 (x) -> x
被翻译为 InvokeDynamic ,而Function.identity()
被翻译为传统 InterfaceMethod 。
答案 2 :(得分:0)
这种方法并没有真正起作用,布尔标志是代码气味,提示问题:而不是
if flag then map(foo) else map(bar)
你最好传递将通过可选项映射的函数并说出
map(f)
好处很明显:就目前而言,您的代码可以修剪字符串或不执行任何操作。但是下周,在某些情况下,你会希望它也是大写的,或小写的,或修剪的,逆转的和大写的。那你怎么办呢?写一个枚举?