当前位置: 首页 > 知识库问答 >
问题:

FilenameFilter的Java 8 lambda表达式

周苑博
2023-03-14

我正在学习java 8中的lambda表达式

当我改变代码的线程它的工作正常

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("run");
    }
}).start();

转换为lambda表达式,如下所示:

new Thread(
    () -> System.out.println("Hello from thread")
).start();

但我无法转换FilenameFilter表达式

File file = new File("/home/text/xyz.txt");
file.list(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        name.endsWith(".txt");
        return false;
    }
});

并没有成功地将其转化为

file.list(new FilenameFilter () {
    (File a1, String a2) -> { 
        return false;
    }
});

它给出的错误和eclipse中的一样

此行有多个标记
-语法错误,插入";"以完成语句
-语法错误,插入"}"以完成Block
-语法错误,插入"Assignment算子表达式"以完成Assignment

共有3个答案

柯琛
2023-03-14

它应该更简单:

f.list((File a1, String a2) -> {return false;});

甚至:

f.list((a1,a2) -> {return false;});

lambda表达式替换抽象类实例的实例化。

狄兴邦
2023-03-14

FileNameFilter是一个功能接口。您不需要显式地实例化它。

    f.list((dir, name) -> name.endsWith(".txt"));

还要注意,f应该是一个目录,而不是像您的示例中那样的文件。如果f1是文件,则使用指定的过滤器返回null

邢博涛
2023-03-14

首先,你的格式太糟糕了,整理一下!

现在,lambda语法;要转换匿名类,请执行以下操作:

final FilenameFilter filter = new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        return false;
    }
};

首先,我们用一个等效的lambda替换匿名类,用于单个方法accept(File dir,String name)

final FilenameFilter filter = (File dir, String name) -> {
    return false;
};

但是我们可以做得更好,我们不需要定义类型——编译器可以解决这些问题:

final FilenameFilter filter = (dir, name) -> {
    return false;
};

我们还可以做得更好,因为该方法返回一个布尔值;如果有一条语句的计算结果为布尔值,我们可以跳过返回和大括号:

final FilenameFilter filter = (dir, name) -> false;

这可以是任何语句,例如:

final FilenameFilter filter = (dir, name) -> !dir.isDirectory() && name.toLowerCase().endsWith(".txt");

但是,文件API非常旧,所以不要使用它。使用nioapi。这是自2011年Java 7以来的事情,所以真的没有借口:

final Path p = Paths.get("/", "home", "text", "xyz.txt");
final DirectoryStream.Filter<Path> f = path -> false;
try (final DirectoryStream<Path> stream = Files.newDirectoryStream(p, f)) {
    stream.forEach(System.out::println);
}

事实上,你的例子在文件中内置了一个特定的方法,它需要一个Glob:

final Path p = Paths.get("/", "home", "text", "xyz.txt");
try (final DirectoryStream<Path> stream = Files.newDirectoryStream(p, "*.txt")) {
    stream.forEach(System.out::println);
}

或者,使用更现代的文件。列表

final Path p = Paths.get("/", "home", "text", "xyz.txt");
final PathMatcher filter = p.getFileSystem().getPathMatcher("glob:*.txt");
try (final Stream<Path> stream = Files.list(p)) {
    stream.filter(filter::matches)
          .forEach(System.out::println);
}

这里的filter::matches是一个方法引用,因为方法路径匹配器。匹配项可用于实现功能接口谓词

顺便说一句:

f.list(new FilenameFilter() {

    @Override
    public boolean accept(File dir, String name) {
        name.endsWith(".txt");
        return false;
    }
});

这没有任何意义...

 类似资料:
  • 问题内容: 我正在通过Java 8中的lambda表达式 当我更改线程代码时,它工作正常 转换为lambda表达式为 但是我无法转换FilenameFilter表达式 并成功转换为 它给错误,如日食 这行有多个标记 -语法错误,请插入“;” 完成语句 -语法错误,插入“}”以完成Block- 语法错误,插入“ AssignmentOperator Expression”以完成分配 问题答案: 首先

  • 问题内容: 我有一个目录: 我想列出名称以整数字符串表示的所有文件,例如“ 10”,“ 20”。 我知道我应该使用: 如何定义我的? PS: 我的意思是文件名可以是任何整数字符串,例如“ 10”或“ 2000000”或“ 3452345”。只要文件名是整数字符串,就没有位数限制。 问题答案: 您应该在 接口中 重写 ,并确保该参数仅包含数字字符。您可以使用以下方法进行检查: __

  • 问题内容: 有没有办法让AngularJS在模型数据中评估表达式? HTML: 模型: 最终结果将是:。 问题答案: 您可以使用该服务来插值字符串… JSFiddle

  • 给定一个元素列表,我想获取具有给定属性的元素并将其从列表中删除。我找到的最佳解决方案是: 是否可以在lambda表达式中组合get和删除?

  • 问题内容: 我正在尝试编写一个正则表达式来检查给定的字符串是否像a + b,2 + a + b,3 + 6 * 9 + 6 * 5 + a * b等… 仅+和*运算符。 我试过了 不幸的是,它仅处理3 * 7 …(数字*数字)之类的情况。 等待您的答案,感谢您的阅读。 问题答案: 把和字符类中。 演示

  • 昨天,我需要向正则表达式添加一个文件路径,创建一个如下所示的模式: 一开始正则表达式不匹配,因为包含几个正则表达式特定的符号,如 或 。作为快速修复,我将它们替换为 和 . 与 . 然而,我问自己,是否没有一种更可靠或更好的方法来清除正则表达式特定符号中的字符串。 Python 标准库中是否支持此类功能? 如果没有,您是否知道一个正则表达式来识别所有正则表达式并通过替代品清理它们?