【问题标题】:Declaring a method within parameter input of an other method?在其他方法的参数输入中声明方法?
【发布时间】:2015-02-11 01:26:21
【问题描述】:

我正在寻找一种方法来获取当前目录中所有以 .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

【问题讨论】:

    标签: java file parameters filter


    【解决方案1】:

    好的FilenameFilter 是一个抽象类,带有抽象方法accept()。你必须实现这个和所有其他的东西(例如比较每个文件名),将由FilenameFilter 完成。你必须在new 之后实现它,因为要创建一个新的过滤器,Java 必须知道你希望FilenameFilter 工作的方式。

    将一些方法抽象化是java的一个基本思想,你必须在实现它的过程中说出你想在特殊情况下做什么。我希望它能让它更清楚一点!

    【讨论】:

    • 确实如此,谢谢。我可能应该先阅读更多关于它们的信息。
    • FilenameFilter 是一个FunctionalInterface,并被这样注释。它基本上是一个只有一个abstract 方法的接口。更多信息:docs.oracle.com/javase/8/docs/api/java/lang/…
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这是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());.
      但是为了方便,我们经常使用匿名类机制来避免编写这么小的类。

      例如,这里有一个使用匿名类的小sn-p。

      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());
      }
      

      【讨论】:

        【解决方案4】:

        我希望您在目录中过滤文件的问题已经解决,您的问题与此代码的工作方式直接相关。这只是匿名类的一个例子。您可以通过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());
        

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

        【讨论】:

          猜你喜欢
          • 2020-12-17
          • 1970-01-01
          • 2013-08-22
          • 1970-01-01
          • 2016-12-13
          • 1970-01-01
          • 2014-12-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多