【问题标题】:Concatenate string values with delimiter handling null and empty strings? [duplicate]使用分隔符连接字符串值处理空字符串和空字符串? [复制]
【发布时间】:2016-04-18 23:15:27
【问题描述】:

在 Java 8 中,我有一些 String 值,我希望得到一个以逗号分隔的有效值列表。如果 Stringnull 或空,我想忽略它。我知道这似乎很常见,很像this old question;但是,该讨论并未涉及空值和空格(我也不喜欢接受的答案)。

我看过 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 循环、将字符串加载到列表中和/或正则表达式替换以删除错误条目)?

【问题讨论】:

  • 简单的 java 8 方式是Stream.of(val1, val2, val3, val4).filter(s -> s!=null && !s.isEmpty()).collect(joining(",")),静态导入为Collectors.joining。如果这不符合您的喜好,您将不得不制作自己的课程或在某个图书馆中找到一个。但是为什么要麻烦呢?
  • 按标题复制,但不是内涵。
  • Java 8 中的this 回答是否不完全符合您的要求?
  • 用户需要忘记重复是不好的想法。如果存在解决方案,我们应该指出它,而不是把知识分散到各处。

标签: java java-8 guava apache-stringutils


【解决方案1】:
String joined = 
    Stream.of(val1, val2, val3, val4)
          .filter(s -> s != null && !s.isEmpty())
          .collect(Collectors.joining(","));

【讨论】:

  • 有很多相关的和重复的问题。请投票结束,如果适用,请在此处提供您的答案。
  • @Pillar 由 Brian Goetz(主要 Java 架构师之一)回答的问题会自动成为其他人应该用作重复目标的问题(他是 Java 8 的 Jon Skeet)。
  • @Brian 如果所有 var1、var2... 都为空,会发生什么?
  • @OptimusPrime 传递给joining() 的分隔符是一个分隔符。如果所有元素都为空,则它们都会被过滤,因此呈现给collect() 的流是空的。在这种情况下,你会得到一个空字符串。 joining() 的其他版本也可以让您指定前缀和后缀,在这种情况下您会得到 prefix + suffix
  • 是的,只需将collectingAndThen() 与将"" 映射到null 的整理函数一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 2016-07-20
  • 2010-10-09
相关资源
最近更新 更多