java 8 个用于 FilenameFilter 的 lambda 表达式
java 8 lambda expression for FilenameFilter
我正在 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 表达式,则不必输入 class 名称:
f.list(
(File a1, String a2) -> {
return false; }
);
事实上,在您的第一个示例中,您省略了 new Runnable()
。
应该更简单:
f.list((File a1, String a2) -> {return false;});
甚至:
f.list((a1,a2) -> {return false;});
lambda 表达式替换了抽象 class 实例的实例化。
首先,您的格式很糟糕,请解决!
现在,lambda 语法;转换匿名 class:
final FilenameFilter filter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return false;
}
};
我们首先用单个方法 accept(File dir, String name)
:
的等效 lambda 替换匿名 class
final FilenameFilter filter = (File dir, String name) -> {
return false;
};
但我们可以做得更好,我们不需要定义类型 - 编译器可以解决这些问题:
final FilenameFilter filter = (dir, name) -> {
return false;
};
我们还可以做得更好,因为方法 return a 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
可以用来实现功能接口Predicate<Path>
,因为它需要一个Path
和return是一个boolean
.
顺便说一句:
f.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
name.endsWith(".txt");
return false;
}
});
这毫无意义...
FileNameFilter
是函数式接口。您不需要显式实例化它。
f.list((dir, name) -> name.endsWith(".txt"));
另请注意,f
应该是目录,而不是示例中的文件。 f1
是文件的示例将 return null
与指定的过滤器。
我正在 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 表达式,则不必输入 class 名称:
f.list(
(File a1, String a2) -> {
return false; }
);
事实上,在您的第一个示例中,您省略了 new Runnable()
。
应该更简单:
f.list((File a1, String a2) -> {return false;});
甚至:
f.list((a1,a2) -> {return false;});
lambda 表达式替换了抽象 class 实例的实例化。
首先,您的格式很糟糕,请解决!
现在,lambda 语法;转换匿名 class:
final FilenameFilter filter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return false;
}
};
我们首先用单个方法 accept(File dir, String name)
:
final FilenameFilter filter = (File dir, String name) -> {
return false;
};
但我们可以做得更好,我们不需要定义类型 - 编译器可以解决这些问题:
final FilenameFilter filter = (dir, name) -> {
return false;
};
我们还可以做得更好,因为方法 return a 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
可以用来实现功能接口Predicate<Path>
,因为它需要一个Path
和return是一个boolean
.
顺便说一句:
f.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
name.endsWith(".txt");
return false;
}
});
这毫无意义...
FileNameFilter
是函数式接口。您不需要显式实例化它。
f.list((dir, name) -> name.endsWith(".txt"));
另请注意,f
应该是目录,而不是示例中的文件。 f1
是文件的示例将 return null
与指定的过滤器。