gpt4 book ai didi

FilenameFilter 的 java 8 lambda 表达式

转载 作者:太空狗 更新时间:2023-10-29 22:48:12 25 4
gpt4 key购买 nike

我正在研究 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 中一样给出错误

Multiple markers at this line
- Syntax error, insert ";" to complete Statement
- Syntax error, insert "}" to complete Block
- Syntax error, insert "AssignmentOperator Expression" to complete Assignment

最佳答案

首先,您的格式糟糕,请解决!

现在,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;
};

我们还可以做得更好,因为该方法返回 boolean ;如果我们有一个评估为 boolean 的语句我们可以跳过 return和大括号:

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

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

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

然而,File API 非常旧,所以不要使用它。使用 nio API .这是自 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);
}

事实上,您的示例在 Files 中内置了一个特定方法那takes a Glob :

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

或者,使用更现代的 Files.list :

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是方法引用,因为方法 PathMatcher.matches可用于实现功能接口(interface)Predicate<Path>因为它需要 Path并返回 boolean .


顺便说一句:

f.list(new FilenameFilter() {

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

这没有意义...

关于FilenameFilter 的 java 8 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29316310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com