java 8 lambda expression for FilenameFilter -
i going through lambda expression in java 8
when changed code of thread it's working fine
new thread(new runnable() { @override public void run() { system.out.println("run"); } }).start(); is converted lambda expression as
new thread( () -> system.out.println("hello thread") ).start(); but not able convert filenamefilter expression
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; } }); and unsuccessfully converted
file.list(new filenamefilter () { (file a1, string a2) -> { return false; } }); it's giving error in eclipse
multiple markers @ line
- syntax error, insert ";" complete statement
- syntax error, insert "}" complete block
- syntax error, insert "assignmentoperator expression" complete assignment
first things first, formatting horrible, sort out!
now, lambda syntax; convert anonymous class:
final filenamefilter filter = new filenamefilter() { @override public boolean accept(file dir, string name) { return false; } }; we start replacing anonymous class equivalent lambda single method accept(file dir, string name):
final filenamefilter filter = (file dir, string name) -> { return false; }; but can better, don't need define types - compiler can work out:
final filenamefilter filter = (dir, name) -> { return false; }; and can better still, method return boolean; if have single statement evaluates boolean can skip return , braces:
final filenamefilter filter = (dir, name) -> false; this can statement, example:
final filenamefilter filter = (dir, name) -> !dir.isdirectory() && name.tolowercase().endswith(".txt"); however, file api very old, don't use it. use nio api. has been around since java 7 in 2011 there no excuse:
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); } and in fact example has specific method built files takes glob:
final path p = paths.get("/", "home", "text", "xyz.txt"); try (final directorystream<path> stream = files.newdirectorystream(p, "*.txt")) { stream.foreach(system.out::println); } or, using more modern 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); } here filter::matches method reference because method pathmatcher.matches can used implement functional interface predicate<path> takes path , returns boolean.
as aside:
f.list(new filenamefilter() { @override public boolean accept(file dir, string name) { name.endswith(".txt"); return false; } }); this makes no sense...
Comments
Post a Comment