Как метод с несколькими параметрами передается в функцию, которая принимает список? - PullRequest
0 голосов
/ 28 сентября 2018

Я не могу понять, как функция передается через лямбду в этот метод

public class OrderUtil {
 public static <I, O> List<O> runInBatches(List<I> inputList, 
 Function<List<I>, List<O>> functionToRunInBatches) {
    return Lists.partition(inputList, BATCH_CHUNK_SIZE).stream()
            .flatMap(batch -> functionToRunInBatches.apply(batch).stream())
            .collect(toList());
    }
}

Я вижу код ниже, я не могу понять, как приведенная ниже лямбда-функция переводится в functionToRunInBatches выше?orderDao.getOrderForDates (...) принимает три параметра (orders, startdate, enddate), но моя функция берет список и возвращает список.Как этот вызов работает нормально?

Я прочитал учебники и документацию по функции.

Возможно ли, чтобы кто-то нарушил то, как лямбда отображается в функции выше?Я не могу представить, как все это работает.

 private List<Order> getOrderForDates(List<Long> orderNumbers, 
                                           tring startDate, String endDate){
    return OrderUtil.runInBatches(orderNumbers,
            orderBatch -> orderDAO.getOrderForDates(orderBatch, startDate, endDate));
}

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Это лямбда-выражение:

orderBatch -> orderDAO.getOrderForDates(orderBatch, startDate, endDate)

может быть предназначено для Function<List<Long>, List<Order>> функционального интерфейса , потому что:

  • Itполучает аргумент List<Long> с именем orderBatch слева от оператора ->
  • Возвращает List<Order>, поскольку метод orderDAO.getOrderForDates возвращает List<Order>
  • Function - это функциональный интерфейс , означающий, что он объявляет только один абстрактный метод, в данном случае apply

Здесь количество аргументов orderDAO.getOrderForDates метод не имеет никакого значения.Имеет значение количество и типы аргументов лямбда-выражения (только один, который orderBatch типа List<Long>), а также количество и типы аргументов уникального абстрактного метода целевого функционального интерфейса , в этом случае apply метод интерфейса Function.

С другой стороны, startDate и endDate захватываются лямбда-выражением и такжеизвестный как свободные переменные , что означает, что они не являются аргументами функции (они не являются ни аргументами метода Function.apply, ни аргументами лямбда-выражения, поскольку они не объявлены в левой части-> оператор).Они не являются локальными переменными для функции, так как они не объявлены внутри лямбда-выражения.Другими словами, они приходят извне функции, не будучи ее аргументами.

0 голосов
/ 28 сентября 2018

Компилятор превращает лямбду в новый объект Function.Он переопределяет метод apply кодом, заданным в лямбда-выражении.

Так что это:

private List<Order> getOrderForDates(List<Long> orderNumbers, String startDate, String endDate){
    return OrderUtil.runInBatches(orderNumbers, orderBatch -> orderDAO.getOrderForDates(orderBatch, startDate, endDate));
}

эквивалентно этому:

private List<Order> getOrderForDates(List<Long> orderNumbers, String startDate, String endDate){
    return OrderUtil.runInBatches(orderNumbers, new Function<List<Long>, List<Order>>() {
        @Override
        public List<Order> apply(List<Long> orderBatch) {
            return orderDAO.getOrderForDates(orderBatch, startDate, endDate);
        }
    });
}

Your *Затем метод 1011 * просто вызывает apply для этого Function объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...