【问题标题】:Rewrite nested ternary operators in functional way以函数方式重写嵌套的三元运算符
【发布时间】:2025-12-24 03:45:12
【问题描述】:

我有以下代码:

String firstString = "sth";
String secondString = "sthElse";

String stringsSpecialConcat = String.format("%s<br>%s", firstString, secondString);

boolean isFirstStringNotBlank = StringUtils.isNotBlank(firstString);
boolean isSecondStringNotBlank = StringUtils.isNotBlank(secondString);

return isFirstStringNotBlank ? (isSecondStringNotBlank ? stringsSpecialConcat : firstString) : (isSecondStringNotBlank ? secondString : "")

您能帮我通过函数式编程来简化上述内容吗?

我想使用类似的东西

Stream.of(firstString, secondString).collect(joining(""))

【问题讨论】:

    标签: java functional-programming java-stream


    【解决方案1】:
    Stream.of(firstString, secondString)
        .filter(StringUtils::isNotBlank)
        .collect(Collectors.joining("<br>"))
    

    Collectors.joining 只会在有 2 个或更多元素时插入分隔符。在你的情况下,这两个都是非空的。

    如果两者都为空,则结果为""

    如果first为空,则结果为"second"

    如果秒为空,则结果为"first"

    如果两者都不为空,则结果为"first&lt;br&gt;second"

    【讨论】:

    • 这种方法可以很好地扩展任意数量的字符串。但是当最多有两个字符串时,使用reduce((a,b) -&gt; a + "&lt;br&gt;" + b).orElse("")collect 更有效,因为在四种可能的情况下,它只返回一个已经存在的字符串,而在第四种情况下,它只做连接所需的最少工作这两个字符串。
    【解决方案2】:

    这……其实还不错。你能做的最好的就是

    Stream.of(firstString, secondString)
      .filter(StringUtils::isNotBlank)
      .collect(joining("<br>"));
    

    您可能会或可能不会觉得更简单。

    【讨论】:

    • 如果你使用静态导入,你应该显示导入,否则对于那些不熟悉它的人来说,函数joining应该来自哪里是不清楚的
    • 谢谢,很遗憾我不能同时接受两个答案:(