Возможно ли передать в метод ссылку на переменную (в Java)?
Есть три почти одинаковых метода :
private Order[] getCancelOrdersPeriod(String startPeriod, String endPeriod) {
int indexArr = 0;
Order[] orderPeriod = new Order[50];
for (Order order : canceledOrders) {
if (order == null) {
break;
}
if (isTimeOfPeriod(startPeriod, endPeriod, order.getTimeOfOrder().getCancelOrder())) {
orderPeriod[indexArr++] = order;
}
}
return orderPeriod;
}
private Order[] getClosedOrdersPeriod(String startPeriod, String endPeriod) {
int indexArr = 0;
Order[] orderPeriod = new Order[50];
for (Order order : closedOrders) {
if (order == null) {
break;
}
if (isTimeOfPeriod(startPeriod,endPeriod, order.getTimeOfOrder().getClousedOrder())) {
orderPeriod[indexArr++] = order;
}
}
return orderPeriod;
}
private Order[] getDeletedOrdersPeriod(String startPeriod, String endPeriod) {
int indexArr = 0;
Order[] orderPeriod = new Order[50];
for (Order order : deletedOrders) {
if (order == null) {
break;
}
if (isTimeOfPeriod(startPeriod, endPeriod, order.getTimeOfOrder().getDeleteOrder())) {
orderPeriod[indexArr++] = order;
}
}
return orderPeriod;
}
Различаются они только тем что итерируются по разным массивам, и тем как происходит проверка во втором if-е. Получается код повторяется. Я хочу создать метод (один вместо трех) в который буду передавать в качестве параметров дополнительно массив по которому будет происходить поиск, с этим проблем нет. А вот проблема в том что в трех методах идет разная проверка в if-e(если ищем закрытые заказы то проверяем order.getTimeOfOrder().getClousedOrder() если удаленные тогда order.getTimeOfOrder().getDeleteOrder(). Мой вопрос заключается в следующем - возможно ли в Java передавать в качестве параметра ссылку на переменную (то есть что бы я в метод передал ссылку на переменную order.getTimeOfOrder().getCancelOrder()) которую потом применил бы в нужном месте кода). Получается при вызове метода я бы передал 2 строки массив и ссылку на нужную переменную. Возможно это бред))) Если так ни как не сделать то хотелось бы узнать как можно в данной ситуации выкрутиться и уменьшить повторение кода.
Ответы (1 шт):
Функция может принимать другую функцию-маппер, которая будет вытаскивать нужные вам данные из объекта.
Если я правильно понял, что getCancelOrder и прочие возвращают Order, то получается примерно так:
private static Order[] orderProcessing(Order[] orders, String startPeriod, String endPeriod, Function<? super Order, ? extends Order> mapper) {
...
for (Order order : orders) {
...
if (isTimeOfPeriod(startPeriod, endPeriod, mapper.apply(order))) {
...
}
}
...
}
...
// вызов с использованием лямбды
Order[] cancelOrdersPeriod = orderProcessing(canceledOrders, startPeriod, endPeriod, order -> order.getTimeOfOrder().getCancelOrder());