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

Popular posts from this blog

google chrome - Developer tools - How to inspect the elements which are added momentarily (by JQuery)? -

angularjs - Showing an empty as first option in select tag -

php - Cloud9 cloud IDE and CakePHP -