【问题标题】:Iterate two lists to find a match and return boolean using java8使用 java8 迭代两个列表以查找匹配项并返回布尔值
【发布时间】:2020-04-02 04:47:09
【问题描述】:

我有两个列表如下

List<String> pathNames = Lists.newArrayList("/state", "/country", "/country/name");
List<String> newPaths = Lists.newArrayList("/country/name");

我对每个 java 代码都有正常的迭代两个列表以找到匹配项并返回布尔值,如下所示

if(CollectionUtils.isNotEmpty(pathNames)) {
    for (String path : newPaths) {
        for (String reqPath: pathNames) {
            if(FilenameUtils.wildcardMatch(path, reqPath)) {
               return true;
            }
        }
    }
}

但我想在 Java8 中重构并做同样的事情,非常感谢任何帮助。

【问题讨论】:

    标签: java arraylist java-8


    【解决方案1】:

    您可以在两个列表上使用流管道并调用anyMatch

    return CollectionUtils.isNotEmpty(pathNames) &&
           newPaths.stream().anyMatch(np -> 
              pathNames.stream().anyMatch(pn -> FilenameUtils.wildcardMatch(np, pn)));
    

    【讨论】:

    • CollectionUtils.isNotEmpty(pathNames) &amp;&amp; 已过时……
    • @Holger 实际上不会那样做,我认为!pathNames.isEmpty() 就足够了。想要保留原始代码。
    • 好吧,即使!pathNames.isEmpty() 检查也是不必要的,因为流操作是正确的,并且如果您怀疑pathNames 很可能为空而newPaths 很大,您可以通过交换嵌套来优化它,pathNames.stream().anyMatch(pn -&gt; newPaths.stream().anyMatch(np -&gt; …))。我猜,CollectionUtils.isNotEmpty(…) 是其中一种实用方法,它添加了一个有问题的null 处理,所以如果这确实是有意的,那么应该使用明确的null 检查来记录这种null 行为确实是有意的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多