Java 8条件.map()(或具有标识功能的地图)

时间:2014-12-05 12:31:50

标签: java functional-programming java-8 optional

假设我们有布尔标志来打开/关闭流中的地图。例如要修剪或不修剪。

下面的示例是正确的解决方案还是有更好的方法来实现它?

boolean doTrim = true;
optionalValue.map(doTrim ? String::trim : (x) -> x ).get()...

或:

boolean doTrim = true;
optionalValue.map(doTrim ? String::trim : Function.identity() ).get()...

3 个答案:

答案 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)

两个观点:

  1. 从Java语言角度来看

    两者都相同。

  2. 从JVM字节码指令角度来看

    他们是不同的。 (x) -> x被翻译为 InvokeDynamic ,而Function.identity()被翻译为传统 InterfaceMethod

答案 2 :(得分:0)

这种方法并没有真正起作用,布尔标志是代码气味,提示问题:而不是

if flag then map(foo) else map(bar)

你最好传递将通过可选项映射的函数并说出

map(f)

好处很明显:就目前而言,您的代码可以修剪字符串或不执行任何操作。但是下周,在某些情况下,你会希望它也是大写的,或小写的,或修剪的,逆转的和大写的。那你怎么办呢?写一个枚举?