【问题标题】:What's the best way to trim() all elements in a List<String>? [duplicate]修剪() List<String> 中所有元素的最佳方法是什么? [复制]
【发布时间】:2016-04-05 15:28:27
【问题描述】:

我有一个List&lt;String&gt;,可能包含数千个字符串。我正在实施一种验证方法,其中包括确保每个字符串中没有任何前导或尾随空格。

我目前正在遍历列表,为每个 String 调用 String.trim(),并将其添加到新的 List&lt;String&gt; 并在之后重新分配回原始列表:

List<String> trimmedStrings = new ArrayList<String)();
for(String s : originalStrings) {
  trimmedStrings.add(s.trim());
}

originalStrings = trimmedStrings;

我觉得有一种DRYer 方法可以做到这一点。这里有替代的、更有效的方法吗?谢谢!

编辑:是的,我使用的是 Java 8,因此欢迎提出 Java 8 建议!

【问题讨论】:

  • 链接的问题讨论了每个字符串的大写,但这里的修剪是一样的:originalStrings.replaceAll(String::trim);
  • 不幸的是,没有。字符串是不可变的,这意味着您必须使用新的字符串对象而不是列表中已有的对象。使用特定的 List 实现,您可以删除一个元素并将修剪后的对象插入到相同的位置,这将为您节省第二个 List

标签: java list java-8


【解决方案1】:

在 Java 8 中,你应该使用类似的东西:

List<String> trimmedStrings = 
    originalStrings.stream().map(String::trim).collect(Collectors.toList());

还可以通过调用此方法对初始列表的元素使用一元 String::trim 运算符(未修剪的 String 实例将被覆盖):

originalStrings.replaceAll(String::trim);

【讨论】:

  • 谢谢库特里。您的解决方案与 Tunaki 的 originalStrings.replaceAll(String::trim) 有何不同?
  • 他修改了输入列表的元素。所以没有必要声明新的trimmedStrings列表,浪费更多空间。但初始未修剪的String 值将丢失
  • 你应该建议一个 Java 7 解决方案,这是我整理的一个:pastebin.com/sF3ixCq4
  • @Mr.Polywhirl 为什么?这个问题被标记为 Java 8。没有必要为了它的乐趣添加更多代码。尤其是它引入了像CollectionUtil 这样不存在的类。
  • 我在做一些更复杂的事情,你的代码帮助了 Cootri。谢谢你。
【解决方案2】:

如果您使用的是 java-8,则可以使用:

    final List<Object> result = arrayList.stream()
        .map(String::trim)
        .collect(Collectors.toList());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    相关资源
    最近更新 更多