以函数方式重写嵌套的三元运算符

Posted

技术标签:

【中文标题】以函数方式重写嵌套的三元运算符【英文标题】:Rewrite nested ternary operators in functional way 【发布时间】:2021-12-22 09:47:49 【问题描述】:

我有以下代码:

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(""))

【问题讨论】:

【参考方案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应该来自哪里是不清楚的 谢谢,很遗憾我不能同时接受两个答案:(

以上是关于以函数方式重写嵌套的三元运算符的主要内容,如果未能解决你的问题,请参考以下文章

如何避免嵌套三元运算符

三元运算符是不是以定义的方式短路

javascript 嵌套的三元运算符

了解嵌套的 PHP 三元运算符 [重复]

javascript中的嵌套条件三元运算符[关闭]

java多重三元运算符(三目运算符)嵌套