Если я правильно понимаю ваш вопрос, под функциями более высокого порядка вы подразумеваете Function
, который вы передавали методу getSomething
в вашем коде.
Один из способов обдумать это просто представить классы abstract
, назначив каждому из них определенную роль. В одном примере следующий код выполняет ту же оценку, что и в совместно используемом вами коде, но назначая разные роли соответствующим отдельным классам.
abstract class Transform<I, O> {
abstract O queryFunction(I input);
}
abstract class Group<O, R> {
abstract List<R> groupIntoResult(O output);
}
abstract class FetchUtil<R, I, O> {
Group<O, R> group;
Transform<I, O> transform;
public SomeClass<R> getSomething(I input) {
O output = transform.queryFunction(input);
List<R> grouped = group.groupIntoResult(transform.queryFunction(input));
return new SomeClass<>(grouped);
}
}
Нет сомнений, что вы также можете преобразовать их в interface
в зависимости от использования этих API . Вот где исходный код, который вы имели, был ближе к , использующему класс FunctionalInterface
с именем Function
.
Чтобы ответить далее, эти представления , не будучи обобщенным c можно легко расширить для обеспечения реализации c, определенной пользователем, следующим образом
class Transformer extends Transform<CustomerRequest, CustomerResponse> {
@AutoWired
MySerice myService;
@Override
CustomerResponse queryFunction(CustomerRequest input) {
try {
return myService.doSomething(input);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
}
class Grouping extends Group<CustomerResponse, Customer> {
@Override
List<Customer> groupIntoResult(CustomerResponse output) {
return output.getCustomer();
}
}
Обратите внимание на упрощение задач для вашего клиента с FetchUtil
определение сейчас. Для этого нужно только предоставить объект запроса, а вы привязать реализацию преобразования и группировки к классу утилит, который вы написали для обработки ответа.
Ваш клиентский код в конечном итоге сокращается до следующих строк, и вы можете заметить, как это обременяет клиентов, потребляющих ваши услуги:
public class MyClient {
@AutoWired
private FetchUtil<Customer, CustomerRequest, CustomerResponse> fetchUtil;
// bind the above to appropriate Group and Transform implementation
public SomeClass<Customer> fetch() {
CustomerRequest query = new CustomerRequest(/*...*/);
return fetchUtil.getSomething(query);
}
}