【问题标题】:How to use loop in lambda functions in JAVA?如何在 JAVA 的 lambda 函数中使用循环?
【发布时间】:2016-10-19 07:42:21
【问题描述】:

我想使用 lambda 函数创建一个 FileNameFilter。

我的主要问题是我想在函数内部引入一个循环。 我尝试使用过滤器,但无法根据外部列表创建过滤器。

以下是我的代码:

    File targetDir = new File(path);
    FilenameFilter deleteFilter = new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            for(String tag: pageTagsList){
                if(name.equals(tag))
                    return true;
            }
            return false;
        }
    };
    File[] foundFiles = targetDir.listFiles(deleteFilter);

我想做的是这样的:

File[] foundFiles = targetDir.listFiles(
            (dir,name)->pageTagsList.stream()
            .filter(//code to filter here)
            .orElse(false)
            );

有正确的方法吗?

【问题讨论】:

  • 也许这是一个人为的例子,关键是要知道如何在一般的 lambda 主体中进行迭代,但如果不是,最好的解决方案是使用 pageTagsSet 类型的 Set<String> .在HashSet 中查找比遍历列表要快得多。所以(dir,name)->pageTagsList.contains(name) 会这样做

标签: java lambda filter java-stream


【解决方案1】:

您可以让 lambda 成为任何代码块(尽管从其中引用的任何变量都必须是最终的)。对于您想要的结果,您可以执行以下操作:

File[] foundFiles = targetDir.listFiles((dir, name) -> pageTagsList.stream().anyMatch(name::equals));

【讨论】:

    【解决方案2】:

    一个 lambda 可以包含一段代码。语法是这样的:

    (params) -> {
        // Some code.
    
        for (Element elem : elements) {
            // Some code using elem.
        }
    
        return returnValue;
    }
    

    【讨论】:

      【解决方案3】:
      List<String> tags = pageTagList
                         .stream()
                         .filter(t -> t.equals(name)).collect(Collectors.toList());
      

      如果您需要对上述任何内容的解释,请在评论中提问。我发现这段代码可以自我解释。

      【讨论】:

        【解决方案4】:
        @Override
        public boolean accept(File dir, String name) {    
            return pageTagsList.stream()
                .filter(name::equals)
                .findAny()
                .isPresent()
        }
        
        • 这只是返回真假的展示,Aaron Davis 的回答最优雅

        【讨论】:

        • 其实最优雅的解决方案是pageTagsList.contains(name)。从 Java 2…
        猜你喜欢
        • 1970-01-01
        • 2021-11-26
        • 2023-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多