lambda - Java - how do I pass a method as parameter? -
i have stanza of code repeatedly used. here 2 examples:
public java.sql.struct createstruct(string typename, object[] attributes) { string searchpath = getsearchpath(); string name = setsearchpathtoschema(typename); struct ret = delegate().createstruct(name.tolowercase(), attributes); setsearchpath(searchpath); return ret; } public java.sql.array createarray(string typename, object[] elements) { string searchpath = getsearchpath(); string name = setsearchpathtoschema(typename); array ret = delegate().createarray(name.tolowercase(), elements); setsearchpath(searchpath); return ret; } you can see these 2 methods have general form:
public <t> createxxx(string typename, object[] objects) { string searchpath = getsearchpath(); string name = setsearchpathtoschema(typename); t ret = delegate().createxxx(name.tolowercase(), objects); setsearchpath(searchpath); return ret; } where t return type of set of functions createxxx have common signature different return type.
i'm pretty sure how in javascript, f#, c#, scala or number of other languages.
i can't seem wrap head around how in java in type-safe manner allows me call each createxxx method setup , tear-down can happen in 1 block of code, rather sprinkled throughout each wrapper method.
i know use reflection, looking way using lambdas, if possible, or whatever structure makes sense in java.
something this, method called passed third parameter (i know code malformed in java):
public struct createstruct(string typename, object[] attributes) { return createtypewithcorrectsearchpath<>( typename, attributes, delegate().createstruct ); } public struct createarray(string typename, object[] elements) { return createtypewithcorrectsearchpath<>( typename, elements, delegate().createarray ); } private <t> t createtypewithcorrectsearchpath( string typename, object[] objects, [some-method-here]) { string searchpath = getsearchpath(); string name = setsearchpathtoschema(typename); t ret = [some-method-here](name, objects); setsearchpath(searchpath); return ret; } i've read apparently duplicate questions:
as questions method references generics:
for whatever reason it's not gelling me, i'm risking asking question marked duplicate in hopes take pity , me out...
update 2015-02-06
while both louis wasserman , neuron gave same answer, louis more pedantically offered pattern worked best me... explicit example of how pass method reference.
here's ended working me:
interface searchpathcreator<t> { t create(string typename, object[] objects) throws sqlexception; } private <t> t createtypewithcorrectsearchpath( string typename, object[] objects, searchpathcreator<?> creator) throws sqlexception { string searchpath = getsearchpath(); string name = setsearchpathtoschema(typename); //noinspection unchecked t ret = (t) creator.create(name.tolowercase(), objects); setsearchpath(searchpath); return ret; } which called louis suggested:
public struct createstruct( string typename, object[] attributes) throws sqlexception { return createtypewithcorrectsearchpath( typename, attributes, delegate()::createstruct ); }
interface mymethodtype<t> { t method(string name, object[] objects); } private <t> t createtypewithcorrectsearchpath( string typename, object[] objects, mymethodtype<t> impl) { string searchpath = getsearchpath(); string name = setsearchpathtoschema(typename); t ret = impl.method(name, objects); setsearchpath(searchpath); return ret; } createtypewithcorrectsearchpath(typename, objects, delegate()::createstruct); the crucial bits a) creating own interface type, though suppose use bifunction<string, object[]>, b) using method references ::.
Comments
Post a Comment