A simple snippet that shows how Java 8 lambdas can be really nice to replace operations that used to require a lot of boilerplate in earlier versions of Java.
If you want to find the most recent file or subfolder in a folder with Java 8, here’s what you need to do:
Path parentFolder = Paths.get("path", "to", "your", "file"); Optional<File> mostRecentFileOrFolder = Arrays .stream(parentFolder.toFile().listFiles()) .max( (f1, f2) -> Long.compare(f1.lastModified(), f2.lastModified())); if (mostRecentFolder.isPresent()) { File mostRecent = mostRecentFileOrFolder.get(); System.out.println("most recent is " + mostRecent.getPath()); } else { System.out.println("folder is empty!"); }
The very nice thing is that you can take advantage of the flexibility of Java 8 streams to either make the operation parallel (just throw in a parallel()
call after Arrays.stream()
), or to filter results according to other criteria.
For example, if you’re only interested in one type of child elements (a file or a folder), you could…
// if you're only interested in files... Optional<File> mostRecentFile = Arrays .stream(parentFolder.toFile().listFiles()) .filter(f -> f.isFile()) .max( (f1, f2) -> Long.compare(f1.lastModified(), f2.lastModified())); // if you're interested in folders... Optional<File> mostRecentFolder = Arrays .stream(parentFolder.toFile().listFiles()) .filter(f -> f.isDirectory()) .max( (f1, f2) -> Long.compare(f1.lastModified(), f2.lastModified()));