【问题标题】:Remove multiple string from a string using stream使用流从字符串中删除多个字符串
【发布时间】:2020-01-15 15:18:28
【问题描述】:

我有一个字符串列表和一个字符串。如果字符串有任何列表,那么我需要删除它。

我正在使用以下方法并且它工作正常。我只是想知道这是否可以使用 Stream API 替换?

List<String> exclude = getExcludeList();

String phrase = "My test phrase";

for (String str: exclude) {
    phrase = phrase.replace(str, "");
}

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

    您可以形成一个由列表中的字符串组成的正则表达式替换,然后进行正则表达式替换以将它们从短语中删除:

    List<String> exclude = getExcludeList();
    String phrase = "My test phrase";
    String regex = exclude.stream().collect(Collectors.joining("|", "\\b(?:", ")\\b"));
    phrase = phrase.replaceAll(regex, "");
    

    【讨论】:

    • 为了安全起见,我会插入一个.map(Pattern::quote)。迄今为止的最佳答案,甚至可能对大量排除字符串具有显着的性能优势。但是,必须指出的是,它没有相同的语义,但在大多数情况下,这种解决方案的语义更可取。
    【解决方案2】:

    这有点难看,因为您想修改流内的非流变量,而流只能从其范围之外有效地访问最终变量。

    但这是可行的:

    String[] holder = new String[] {phrase};
    
    exclude.stream().foreach(s -> phrase[0] = phrase[0].replace(s, "");
    

    【讨论】:

      【解决方案3】:

      在 Java 8 的“Streamy”-Way 中,最好的方法是使用缩减收集器:

      String phrase = getExcludeList().stream()
          .collect(Collectors.reducing(
              "My test phrase",
              (ph, t) -> ph.replace(t, "")
          ));
      

      【讨论】:

        猜你喜欢
        • 2013-08-20
        • 2023-01-11
        • 1970-01-01
        • 2013-07-05
        • 2016-09-23
        • 2017-04-30
        • 1970-01-01
        • 2012-04-09
        • 2019-09-08
        相关资源
        最近更新 更多