我似乎无法在谷歌上找到任何东西,我不确定它是否可行。我想要做的是将一行Java代码作为参数传递给方法。 Google只会将cmd行参数传递给方法,但我希望传递一行实际的代码。
基本上我想将methodA传递给methodB,但methodA不是方法,而是一行代码。下面是将方法传递给使用反射的方法的完整示例。
public class Relation<T> {
protected Set<Pair<T,T>> pairs = null;
public Relation() {
this.pairs = new LinkedHashSet<Pair<T,T>>();
}
/* Next 2 methods are methods for sending methods to methods useing java.lang.reflect.Method */
public Method getMethod(String name) {
try { return Relation.class.getDeclaredMethod(name);
} catch (Exception e) {}
return null;
}
public boolean execute(Method method, Object... params) {
try { return (Boolean) method.invoke(this, params);
} catch (Exception e) {}
return false;
}
/* The method I reuse several times so I just put methods inside of it */
public boolean pairsTFIterator(Method method) {
for(Pair<T,T> x : pairs) {
boolean bool = false;
for(Pair<T,T> y : pairs) {
if(execute(method, x,y))
bool = true; break;
}
if(!bool) return false;
}
return true;
}
/* To be replaced by the line of code*/
public static <T> boolean isSymmetricPairs(Pair<T,T> a, Pair<T,T> b) {
return a.getFirst().equals(b.getSecond()) && a.getSecond().equals(b.getFirst()) ? true :false;
}
/* Method that calls others */
public boolean isSymmetric() {
return pairsTFIterator(getMethod("isSymmetricPairs"));
}
}
以上工作正常,但是我想更进一步,只是放弃像“isSymmetricPairs”方法这样的方法,只需将那些方法逻辑行直接放在“pairsTFIterator”中,就像这样:
public boolean isReflexive() {
return baseSetTFIterator(
a.getFirst().equals(b.getSecond()) && a.getSecond().equals(b.getFirst()) ? true :false
);
}
我很确定这是不可能的,但如果有办法做到这一点,那就太好了。
答案 0 :(得分:1)
听起来你正在寻找的是“一流的功能”。有些语言将函数看作变量,因为您可以将它们分配给变量并将它们作为参数传递给其他函数。 Java 8将引入lambda表达式的概念,它将支持这种类型的功能。
此外,还有其他JVM语言已经提供此功能,包括Scala和Groovy,以列出两个更受欢迎的语言。
为了让您了解它的样子,在Groovy中,您可以通过调用each()方法并向其传递一个闭包(本质上是一个函数)来对集合的每个元素执行任意函数。
def list = [1, 2, 3, 4]
def printer = { x -> println x } // defines a closure that takes one arg and prints it
list.each(printer) // prints out the elements
def sum = 0
def summer = { x -> sum += x } // defines a closure that takes one arg and adds it to the sum variable
list.each(summer)
println sum // should be 1 + 2 + 3 + 4
答案 1 :(得分:1)
将代码放入匿名内部类可满足您的要求:
interface PairFilter<T>{
boolean filter(Pair<T, T> a, Pair<T,T> b);
}
在你的迭代器方法中:
public boolean pairsTFIterator(PairFilter filter) {
for(Pair<T,T> x : pairs) {
boolean bool = false;
for(Pair<T,T> y : pairs) {
if(filter.filter(x,y))
bool = true; break;
}
if(!bool) return false;
}
return true;
}
然后调用它:
pairsTFIterator(new PairFilter<T>(){
public boolean filter(Pair<T, T> a, Pair<T,T> b){
return a.getFirst().equals(b.getSecond()) && a.getSecond().equals(b.getFirst()) ? true :false;
}
});