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:

  1. how pass method parameter in java 8?
  2. how pass method parameter in java?
  3. java pass method parameter

as questions method references generics:

  1. java 8 method reference generic types
  2. java method reference method generic parameter

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

Popular posts from this blog

routing - AngularJS State management ->load multiple states in one page -

python - GRASS parser() error -

Swift game error message -