我有一个类,它有几个返回相同类型的方法。因此,例如,我有以下对象定义:
interface MyClass {
String first();
String second();
}
然后我有一个方法,它接受这个类的对象列表,并且应该根据参数调用first()
或second()
方法。一个例子:
void myMethod(List<MyClass> objs, boolean executeFirst) {
objs.forEach(obj -> System.out.println(executeFirst ? obj.first() : obj.second()));
}
有没有办法用引用和实例方法替换executeFirst
参数,我想在objs
对象上执行?所以,例如,理想情况下我想要这样的东西:
void myMethod(List<MyClass> objs, Supplier<String> instanceMethod) {
objs.forEach(obj -> System.out.println(obj::instanceMethod.get());
}
答案 0 :(得分:5)
您需要Function<MyClass, String>
,而不是供应商:
public void foo() {
myMethod(someList, MyClass::first);
}
void myMethod(List<MyClass> objs, Function<MyClass, String> instanceMethod) {
objs.forEach(obj -> System.out.println(instanceMethod.apply(obj));
}
答案 1 :(得分:0)
正如你所提到的,你的课程中会有很多方法,你需要根据一些标志来调用它们。
因此,您需要在某处保留此元信息,最好是地图。
Map<String, Function<MyClass, String>> meta = new HashMap<>()
您可以将此元数据传递给该方法,也可以将其作为该类的一部分。
我已将其传递给该方法,但我希望您明白这一点。
void myMethod(List<MyClass> objs, meta, Supplier<String> flag) {
objs.stream().forEach(obj -> meta.get(flag.get()).apply(obj));
}