Trước tiên, định dạng của bạn là khủng khiếp, sắp xếp nó ra!
Bây giờ, cú pháp lambda; để chuyển đổi các lớp nặc danh:
final FilenameFilter filter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return false;
}
};
Chúng ta bắt đầu bằng cách thay thế lớp nặc danh với một lambda tương đương đối với phương pháp đơn accept(File dir, String name)
:
final FilenameFilter filter = (File dir, String name) -> {
return false;
};
Nhưng chúng ta có thể làm tốt hơn, chúng tôi không cần phải xác định các loại - trình biên dịch có thể làm việc những điều đó:
final FilenameFilter filter = (dir, name) -> {
return false;
};
Và chúng tôi vẫn có thể làm tốt hơn, khi phương thức trả về boolean
; nếu chúng ta có một tuyên bố duy nhất để đánh giá một boolean
chúng ta có thể bỏ qua return
và niềng răng:
final FilenameFilter filter = (dir, name) -> false;
Đây có thể là bất kỳ tuyên bố, ví dụ:
final FilenameFilter filter = (dir, name) -> !dir.isDirectory() && name.toLowerCase().endsWith(".txt");
Tuy nhiên, File
API là rất cũ, do đó, không sử dụng nó. Sử dụng nio API
. Điều này đã được khoảng từ Java 7 năm 2011 do đó thực sự là không cớ:
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);
}
Và trên thực tế ví dụ bạn có một phương pháp cụ thể xây dựng thành Files
rằng 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);
}
Hoặc, sử dụng hiện đại hơn 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);
}
Ở đây filter::matches
là phương pháp tham chiếu e vì phương pháp PathMatcher.matches
có thể được sử dụng để triển khai giao diện chức năng Predicate<Path>
vì phải mất Path
và trả về một boolean
.
Là một sang một bên:
f.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
name.endsWith(".txt");
return false;
}
});
Điều này làm cho không có ý nghĩa ...
Tại sao nên sử dụng 'Tệp' nếu bạn sử dụng Java 8? Tại sao không java.nio.file? – fge
Bạn nên chấp nhận câu trả lời, để biết rằng vấn đề đã được giải quyết ... – lodo
nhờ @lodo để trả lời – SarthAk