【问题标题】:Check if String Array contains a Substring without loop检查字符串数组是否包含没有循环的子字符串
【发布时间】:2019-02-04 07:23:46
【问题描述】:

我想在字符串数组中找到一个子字符串,而不使用循环。我正在使用:

import java.util.Arrays;

public class MyClass {
    public static void main(String args[]) {

        String[] files = new String[]{"Audit_20190204_061439.csv","anotherFile"};
        String substring= ".csv";

        if(!Arrays.stream(files).anyMatch(substring::contains)) {
            System.out.println("Not found:" + substring);
        }
    }
}

我总是找不到。这种方法有什么问题?

【问题讨论】:

  • 您只是通过流隐藏循环。这并不比一个简单易懂的for 循环更好,也不会更快。
  • 相反,看看过度使用 lambdas 是如何导致你犯了一个很难发现的错误(错误的子字符串函数中的参数顺序)。

标签: java arrays java-stream


【解决方案1】:

您正在检查String“.csv”是否不包含您的Stream 的任何元素,这与您想要的相反。

应该是:

if (!Arrays.stream(files).anyMatch(s -> s.contains(substring))) {
    System.out.println("Not found:" + substring);
}

附:如评论所述,您可以使用noneMatch 而不是anyMatch,这样就无需否定条件:

if (Arrays.stream(files).noneMatch(s -> s.contains(substring))) {
    System.out.println("Not found:" + substring);
}

如果只在String 的末尾搜索“.csv”子字符串(即视为后缀),则应使用endsWith 而不是contains

【讨论】:

  • ! + anyMatch() -> noneMatch()
  • OP可能想在这里使用String#endWith,因为.csv是一个扩展,应该只出现在字符串的末尾。
【解决方案2】:

您可能需要检查文件扩展名,并可以使用endsWith 代替它并改善您的条件:

if (Arrays.stream(files).noneMatch(a -> a.endsWith(substring))) {
    System.out.println("Not found:" + substring);
}

【讨论】:

    【解决方案3】:

    我不是流专家,但我相信您想要这样的东西:

    String[] files = new String[] { "Audit_20190204_061439.csv", "anotherFile" };
    
    for (String file : files) {
        if (file.endsWith(".csv")) {
            System.out.println("found a CSV file");
        }
    }
    

    我在这里使用String#endsWith 是因为.csv 可能指的是文件扩展名,并且只有在文件名末尾出现时才应该记录命中。

    我们也可以在这里使用String#matches

    Pattern pattern = Pattern.compile(".*\\.csv$");
    for (String file : files) {
        Matcher matcher = pattern.matcher(file);
        if (matcher.find()) {
            System.out.println("found a CSV file");
        }
    }
    

    【讨论】:

    • 我建议不要在循环中使用file#matches(),最好事先创建一个PatternPattern.compile(".*.csv$")
    • @Lino 事实上你之前已经告诉过我了。我想旧习惯很难改掉:-(
    猜你喜欢
    • 2021-12-14
    • 2011-11-09
    • 2013-05-18
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 2020-11-28
    • 2021-12-20
    • 2019-02-04
    相关资源
    最近更新 更多