在另一个方法的参数输入中声明一个方法?

时间:2014-12-12 10:42:56

标签: java file parameters filter

我一直在寻找一种方法来获取当前目录中以.txt结尾的所有文件。我在这里找到了如何做到这一点的答案https://stackoverflow.com/a/5751357/3972558并且它有效。现在我正在审查我自己的代码,我仍然不太明白这是如何工作的,我正试图从中学习。

    File workingDirectory = new File(System.getProperty("user.dir"));
    File[] files = workingDirectory.listFiles(new FilenameFilter() {
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith(".txt");
        }
    });

如何在通常可以找到参数输入的地方声明方法?我可能以错误的方式提出我的问题,因为我不明白为什么这种语法是正确的。

具体来说,这是如何正确输入listFiles()

new FilenameFilter() {
            public boolean accept(File dir, String name) {
                return name.toLowerCase().endsWith(".txt");
            }
        }

更新:我现在看到你确实正在为FileNameFilter接口实现accept方法。如何在关键字new之后实现它是如何实现的。

http://docs.oracle.com/javase/7/docs/api/java/io/File.html http://docs.oracle.com/javase/7/docs/api/java/io/FileFilter.html

4 个答案:

答案 0 :(得分:2)

Ok FilenameFilter是一个抽象类,使用抽象方法accept()。您必须实现此功能以及所有其他内容(例如,比较每个文件名),将由FilenameFilter完成。您必须在new之后实现它,因为要创建新的过滤器,Java必须知道您希望FilenameFilter能够工作。

java的基本思想是使一些方法抽象化,你必须在说明你想要在你的特殊情况下做什么的方式实现它。我希望它能让它更清晰一点!

答案 1 :(得分:1)

您没有声明方法。这是一个作为参数的类。它是一个抽象类,您提供了一个匿名类实现。

答案 2 :(得分:1)

它是anonymous class

File::listFiles(FilenameFilter filter)FilenameFilter作为参数 您可以通过经典方式创建自己的FilenameFilter

public class MyFilter extends FilenameFilter {
    public boolean accept(File dir, String name) {
        return name.toLowerCase().endsWith(".txt");
    }
}

然后像workingDirectory.listFiles(new MyFilter());一样使用它 但为方便起见,我们经常使用匿名类机制来避免编写这么小的类。

例如,这是一个使用匿名类的小片段。

public class Duck {
    public String couak() {
        return "couak couak";
    }
}

public static void main(String[] args) {
     Duck englishDuck = new Duck();
     // In the next line, we create a Duck and override the couak() method
     Duck frenchDuck = new Duck() {
         @Override
         public String couak() {
             return "coin coin";
         }
     };
     System.out.println(englishDuck.couak());
     System.out.println(frenchDuck.couak());
}

答案 3 :(得分:1)

我希望您在目录中过滤文件的问题已得到解决,您的问题与此代码的工作原理直接相关。这只是匿名类的一个例子。你在here上了解了更多相关信息。这篇文章的摘要是;

  

匿名类使您可以使代码更简洁。他们   使您能够同时声明和实例化一个类。他们   就像当地的班级,除了他们没有名字。使用它们   如果你只需要使用一次本地课程。

当你想要只实现一次类时,这非常方便,例如,如果你必须在多个地方使用你的过滤器,你将创建一个实现FilenameFilter的类,如下所示;

public class TxtFileFilter implements FilenameFilter {

    @Override
    public boolean accept(File arg0, String arg1) {
        return arg1.toLowerCase().endsWith(".txt");
    }
}

并像在不同的地方一样使用它

File[] files = workingDirectory.listFiles(new TxtFileFilter());

我希望这会有所帮助。快乐编码:)