Возможно ли передать в метод ссылку на переменную (в 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 шт):

Автор решения: IR42

Функция может принимать другую функцию-маппер, которая будет вытаскивать нужные вам данные из объекта.

Если я правильно понял, что 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());
→ Ссылка