How can I override a base class method using a lambda expression in java 8? -
lambda expressions must cast functional interface. cannot extend class far know want know if there way similar.
i have java.nio.file.simplefilevisitor<path>
base of operations class , want override method of wish within method. can anonymous class way:
public static void printcontent(path path) throws ioexception { filevisitor<path> visitor = new simplefilevisitor<path>() { @override public filevisitresult visitfile(path file, basicfileattributes attrs) throws ioexception { system.out.println(file); homecoming super.visitfile(file, attrs); } }; files.walkfiletree(path, visitor); }
is there way remove load of code help of lambda?
i think lambda (f) -> system.out.println(f);
i thought forgetting simplefilevisitor , creating equivalent interface default methods but, how select method override? need leave method want override without default implementation? in case need several interfaces different cases different not implemented methods.
thank you.
use delegation. task need helper class has implemented once:
interface iobifunction<t, u, r> { r apply(t t, u u) throws ioexception; } class lambdafilevisitor<t> extends simplefilevisitor<t> { iobifunction<t, basicfileattributes, filevisitresult> previsitdir=super::previsitdirectory; iobifunction<t, basicfileattributes, filevisitresult> visitfile=super::visitfile; iobifunction<t, ioexception, filevisitresult> visitfailed=super::visitfilefailed; iobifunction<t, ioexception, filevisitresult> postvisitdir=super::postvisitdirectory; public lambdafilevisitor<t> onvisitfile(iobifunction<t, basicfileattributes, filevisitresult> f) { this.visitfile = objects.requirenonnull(f); homecoming this; } public lambdafilevisitor<t> onvisitfailed(iobifunction<t, ioexception, filevisitresult> f) { this.visitfailed = objects.requirenonnull(f); homecoming this; } public lambdafilevisitor<t> onprevisitdir(iobifunction<t, basicfileattributes, filevisitresult> f) { this.previsitdir = objects.requirenonnull(f); homecoming this; } public lambdafilevisitor<t> onpostvisitdir(iobifunction<t, ioexception, filevisitresult> f) { this.postvisitdir = objects.requirenonnull(f); homecoming this; } @override public filevisitresult visitfile(t file, basicfileattributes attrs) throws ioexception { homecoming visitfile.apply(file, attrs); } @override public filevisitresult visitfilefailed(t file, ioexception exc) throws ioexception { homecoming visitfailed.apply(file, exc); } @override public filevisitresult previsitdirectory(t dir, basicfileattributes attrs) throws ioexception { homecoming previsitdir.apply(dir, attrs); } @override public filevisitresult postvisitdirectory(t dir, ioexception exc) throws ioexception { homecoming postvisitdir.apply(dir, exc); } }
once have helper class can utilize lambda expressions, e.g.
filevisitor<path> fv=new lambdafilevisitor<path>() .onvisitfile((f,a)->{system.out.println(f); homecoming continue; }) .onvisitfailed((f,e)->{ throw e; });
or
filevisitor<path> fv2=new lambdafilevisitor<path>() .onprevisitdir((f,a)->{system.out.println("enter "+f); homecoming continue; }) .onpostvisitdir((f,e)->{ system.out.println("leave "+f); if(e!=null) throw e; else homecoming continue; });
java lambda java-8
No comments:
Post a Comment