我不确定这是否适合您的需求,但它有点反复,而不是检查某些类型.
您可以这样运行我的解决方案:
Stream.of(new Employee("Adam", 38, 3000), new Employee("John", 19, 2000))
.forEach(
e->ArrayCaller.>convert(e::getName, e::getAge, e::getSalary)
.call((a, b, c) -> operation(a, b, c)));
它会称这个’main’类的简单方法:
private void operation(String name, int age, double salary) {
System.out.format("%s %d %.0f\n", name, age, salary);
}
当然它需要这种辅助类型:
/** Extending interfaces must have a method called consume with N args */
interface NConsumer {}
/*
* Method must be called consume for reflection.
*
* You can define N interfaces like this.
*/
nterface TriConsumer extends NConsumer {
void consume(A a, B b, C c);
}
interface ArrayCaller {
void call(E code);
static ArrayCaller convert(Supplier>...argSuppliers) {
final Object[] args = new Object[argSuppliers.length];
for (int i = 0; i < argSuppliers.length; i++) {
args[i] = argSuppliers[i].get();
}
return new ArrayCaller() {
@Override
public void call(T code) {
for (Method m: code.getClass().getMethods()) {
if (m.getName().equals("consume")) {
try {
m.invoke(code, args);
} catch (IllegalAccessException
| IllegalArgumentException
| InvocationTargetException e) {
throw new RuntimeException(e);
}
}
}
}
};
}
}