如何使用分隔符连接字符串值并处理空和空串?

59
在Java 8中,我有一些String值,我想得到一个用逗号分隔的有效值列表。如果一个Stringnull或空,我想要忽略它。我知道这似乎很普遍,很像这个老问题;然而,那个讨论没有处理null和空格(我也不喜欢被接受的答案)。
我看过了Java 8 StringJoiner、Commons StringUtils (join) 和可靠的Guava (Joiner),但似乎都不是完整的解决方案。我的设想:
 where: val1 = "a", val2 = null, val3 = "", val4 = "b"

  String niceString = StringJoiner.use(",").ignoreBlanks().ignoreNulls()
    .add(val1).add(val2).add(val3).add(val4).toString();

...将导致niceString = a,b

有没有一种好的方法来做到这一点(不涉及for循环、将字符串加载到列表中以及/或使用正则表达式替换来删除错误条目)?


2
https://dev59.com/xl0Z5IYBdhLWcg3wfge- - Savior
6
Java 8提供一种简单的方式,即 Stream.of(val1, val2, val3, val4).filter(s -> s!=null && !s.isEmpty()).collect(joining(",")),需要静态导入Collectors.joining。如果您不喜欢这种方式,可以编写自己的类或者在某个库中找到。但是为什么要费事呢? - Misha
1
标题可能相同,但意图不同。 - eze
5
Java 8中的这个答案是否不正是你所要求的?请看这里:https://dev59.com/TGoy5IYBdhLWcg3wguWS#35570259 - Savior
5
用户需要摒弃“重复是不好的”这种观念。如果有解决方案,我们应该指向它,而不是将知识分散到各处。 - Savior
1个回答

176
String joined = 
    Stream.of(val1, val2, val3, val4)
          .filter(s -> s != null && !s.isEmpty())
          .collect(Collectors.joining(","));

1
有很多相关和重复的问题。如果适用,请投票关闭并在那里提供您的答案。 - Savior
15
@Pillar提出的问题由Java的主要架构师之一Brian Goetz回答后,这些答案应成为其他人可用作重复目标的问题(他是我们Java 8中类似于Jon Skeet的人物)。 - Pshemo
2
@Brian 如果 var1、var2... 全部都是 null,会发生什么? - Optimus Prime
4
@OptimusPrime 在joining()方法中传递的分隔符是一个分离器。如果所有元素都为null,则它们都会被过滤,因此呈现给collect()的流为空。在这种情况下,输出的结果将是空字符串。joining()还有其他版本,可以让您指定前缀和后缀,在这种情况下,您将获得前缀+后缀 - Brian Goetz
3
可以使用collectingAndThen()方法,并结合一个终止函数,将空字符串""映射为null - Brian Goetz
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接