如果有人问这个问题,我提前道歉,但我几个小时以来一直在努力解决这个问题(我能用谷歌搜索一切),真的希望有人能提供帮助。
我正在尝试收集两个字符串值,我试图从源获取这两个字符串值到单个字符串中,如果这些值不存在则返回
null
(source.getA
返回null
)。
到目前为止,我已经想出了这段代码:
if (source.getA() != null && source.getB() != null) {
target.setAAndB(Stream.of(source.getA(), source.getB())
.map(String::valueOf)
.collect(Collectors.joining(" ")));
} else {
target.setAandB(null);
}
如何将其变成漂亮的链条?我知道有办法,但我觉得我在这里缺少一个技巧。
编辑:
target.setAandB(
Optional.of(
Stream.of(source.getA(), source.getB())
.map(String::valueOf)
.collect(Collectors.joining(" "))
).orElse(null)
);
取得了一些进展,但这里
orElse
不起作用,因为收集器仍然返回一个由两个 null
字符串组合而成的字符串。
编辑2:
谢谢大家的回答,我发现它们非常有价值,并且有一些值得考虑的有价值的事情。
可以使用三元运算符
target.setAandB(Objects.isNull(source.getA()) && Objects.isNull(source.getB()) ? null
: Stream.of(source.getA(), source.getB())
.map(String::valueOf).collect(Collectors.joining(" ")));
使用Optional隐藏条件逻辑没有任何好处。
请参阅 Java 和 OpenJDK 开发人员 @StuartMarks 的 answer。
的主要用途如下:Optional
Optional 旨在为库方法返回类型提供有限的机制,其中 显然需要表示“无结果”,并且使用 null 因为这极有可能导致错误。
典型的代码味道
是,而不是使用方法链接到的代码 处理从某个方法返回的Optional
,它创建一个Optional
来自可为空的东西,以便链接方法并避免 条件句.
创建Optional来避免空检查
是不合理的。它模糊了逻辑并使您的代码更难以阅读。仅仅为了连接两个
Strings
而使用Streams显然是一种矫枉过正。除了流之外,我们有足够的工具来实现这一点。
也就是说,你的代码可能会这样写:
if (source.getA() != null && source.getB() != null) {
target.setAandB(source.getA() + " " + source.getB());
} else {
target.setAandB(null);
}
或者,您可以引入一个负责生成此字符串的方法:
public String getAB() {
return source.getA() == null || source.getB() == null ? null :
source.getA() + " " + source.getB();
}
注意:,如果
getA()
和 getB()
不是普通的 getter,并且 source
对象在幕后执行某些操作来获取数据,则需要将两者存储到局部变量中,而不是获取两次。
target.setAandB(source.getA() == null || source.getB() == null
? null
: source.getA() + " " + source.getB());
正如其他人在这个问题上所说的那样,流和选项对于这种情况来说有点矫枉过正。与基于
Optional
的解决方案相比,具有传统空检查和字符串连接的三元条件运算符更干净且更易于遵循。