我试图将选择的A类“获取”方法传递给B类中的方法。我已经将Java PassMethod作为Parameter签出,但是我无法以合理的方式采用接口方法解决问题。我宁愿 不 使用Java 8(lambdas),并尽可能避免反射。我的感觉是,我以错误的方式看待自己的问题。这是我要完成的工作的特定简化示例:
我有一个包含一些字段和get-method的类:
public class DataStore { private float a; private float b; private float c; public float getA() { return a; } public float getB() { return b; } public float getC() { return c; } }
接下来,我将主类实例DataStore化为Map的Values,然后访问DataStore的特定字段,例如:
DataStore
public class App { public static void main(String[] args) { // declare TreeMap using DataStore class as value Map<Integer, DataStore> dataMap = new TreeMap<Integer, DataStore>(); // populate Map with example data dataMap.put(2, new DataStore(1f,2f,3f)); dataMap.put(10, new DataStore(3f,4f,5f)); dataMap.put(4, new DataStore(6f,7f,8f)); // work with specific fields in DataStore, e.g. assign to array float[] aArray = getValuesAsArray(dataMap, DataStore.getA()); float[] bArray = getValuesAsArray(dataMap, DataStore.getB()); float[] cArray = getValuesAsArray(dataMap, DataStore.getC()); } /** * Assign specific field of DataStore from Map to Array * @param dataMap * @param getVar - reference for specified getter method * @return */ private static float[] getValuesAsArray(Map<Integer, DataStore> dataMap, MethodReference getVar()) { int i = 0; int nMap = dataMap.size(); float[] fArray = new float[nMap]; for (Map.Entry<Integer, DataStore> entry : dataMap.entrySet()) { DataStore ds = entry.getValue(); fArray[i] = ds.getVar(); i++; } return fArray; } }
显然,这是行不通的,因为我必须弄清楚如何将所选的get方法传递到中getValuesAsArray()。我想我的方法可能不正确。因此,我愿意征求意见。
getValuesAsArray()
您的getX()方法可以看作是接受DataStore实例并返回浮点数的Function。
getX()
在Java 8中,您可以使用方法引用来表示它们:
float[] aArray = getValuesAsArray(dataMap, DataStore::getA); float[] bArray = getValuesAsArray(dataMap, DataStore::getB); float[] cArray = getValuesAsArray(dataMap, DataStore::getC);
然后,您getValuesAsArray将接受一个Function<DataStore,Float>参数并执行功能:
getValuesAsArray
Function<DataStore,Float>
private static float[] getValuesAsArray(Map<Integer, DataStore> dataMap, Function<DataStore,Float> func) { int i = 0; int nMap = dataMap.size(); float[] fArray = new float[nMap]; for (Map.Entry<Integer, DataStore> entry : dataMap.entrySet()) { DataStore ds = entry.getValue(); fArray[i] = func.apply(ds); i++; } return fArray; }
在不使用Java 8的情况下,您可以定义自己的接口,该接口包含一个接受DataStore实例并返回的方法float。然后,您不必使用Java 8方法引用,而必须将getValuesAsArray调用其中一个getX()方法的该接口的实现(可以使用实现该接口的匿名类实例)传递给您的方法。
float
例如 :
public interface ValueGetter { public float get (DataStore source); } float[] aArray = getValuesAsArray(dataMap, new ValueGetter() {public float get (DataStore source) {return source.getA();}}); float[] bArray = getValuesAsArray(dataMap, new ValueGetter() {public float get (DataStore source) {return source.getB();}}); float[] cArray = getValuesAsArray(dataMap, new ValueGetter() {public float get (DataStore source) {return source.getC();}});
和
private static float[] getValuesAsArray(Map<Integer, DataStore> dataMap, ValueGetter func) { int i = 0; int nMap = dataMap.size(); float[] fArray = new float[nMap]; for (Map.Entry<Integer, DataStore> entry : dataMap.entrySet()) { DataStore ds = entry.getValue(); fArray[i] = func.get(ds); i++; } return fArray; }