具有多个参数的方法如何传递给采用List的Function?

时间:2018-09-28 16:48:43

标签: java lambda java-8

我无法理解该函数如何通过lambda传递给此方法

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());
    }
}

我看到下面的代码,我无法理解下面的lambda函数如何转换为上面的functionToRunInBatches? orderDao.getOrderForDates(...)接受三个参数(orders,startdate,enddate),但是我的函数接受一个列表并返回一个列表。这个通话如何正常工作?

我已经阅读了有关Function的教程和文档。

有人可以分解lambda如何映射到上面的Function吗?我无法想象它最终如何工作。

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

2 个答案:

答案 0 :(得分:2)

编译器将lambda转换为新的Function对象。它会使用lambda表达式中给出的代码覆盖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);
        }
    });
}

您的runInBatches方法然后只需在该apply对象上调用Function

答案 1 :(得分:2)

此lambda表达式:

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

可以定位Function<List<Long>, List<Order>> 功能接口,因为:

  • 它在List<Long>运算符的左侧收到一个orderBatch自变量,名为->
  • 它返回一个List<Order>,因为orderDAO.getOrderForDates方法返回一个List<Order>
  • Function是一个功能接口,这意味着它仅声明一个抽象方法,在这种情况下为apply

这里orderDAO.getOrderForDates方法的参数数目没有任何重要性。重要的是lambda表达式的参数的数量和类型(只有一个,类型为orderBatch的{​​{1}})以及目标功能接口的 unique参数的数量和类型。抽象方法,在这种情况下为List<Long>接口的apply方法。

另一方面,FunctionstartDate被lambda表达式捕获 ,也称为 free变量,这意味着它们不是函数的参数(它们既不是endDate方法的参数也不是lambda表达式的参数,因为它们不是在Function.apply运算符的左侧声明的)。它们也不是函数的局部变量,因为它们不在lambda表达式中声明。换句话说,它们来自函数外部,而不是函数的参数。