以函数方式重写嵌套的三元运算符
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<br>second"
【讨论】:
这种方法可以很好地扩展任意数量的字符串。但是当最多有两个字符串时,使用reduce((a,b) -> a + "<br>" + b).orElse("")
比collect
更有效,因为在四种可能的情况下,它只返回一个已经存在的字符串,而在第四种情况下,它只做连接所需的最少工作这两个字符串。【参考方案2】:
这……其实还不错。你能做的最好的就是
Stream.of(firstString, secondString)
.filter(StringUtils::isNotBlank)
.collect(joining("<br>"));
您可能会或可能不会觉得更简单。
【讨论】:
如果你使用静态导入,你应该显示导入,否则对于那些不熟悉它的人来说,函数joining
应该来自哪里是不清楚的
谢谢,很遗憾我不能同时接受两个答案:(以上是关于以函数方式重写嵌套的三元运算符的主要内容,如果未能解决你的问题,请参考以下文章