如何向方法传入两个Lambda表达式实现列表获取与Integer提取?
搞定Lambda传参的方法定义问题
嘿,我看你想定义一个方法,传入两个Lambda来实现“获取条目列表+从每个条目提取Integer”的逻辑,现在的参数里Supplier<Integer> idGetter有点小问题——Supplier是无参的,没法拿到每个条目来提取值,咱们来调整一下:
核心问题修正
你需要把第二个Lambda的类型从Supplier<Integer>改成Function<T, Integer>——这里的T是你条目对象的类型,Function可以接收一个输入(也就是单个条目),然后返回提取出的Integer,这才符合“从条目中提取”的需求。
正确的方法定义
通用版本(支持任意条目类型)
如果你的条目是自定义对象(比如用户、订单这类),用泛型方法更灵活:
private <T> List<Integer> getRecentList(List<Integer> searchParams, Function<List<Integer>, List<T>> listGetter, Function<T, Integer> idGetter) { // 第一步:通过listGetter获取完整的条目列表 List<T> itemList = listGetter.apply(searchParams); // 第二步:用idGetter逐个提取Integer,用Stream简化代码 return itemList.stream() .map(idGetter) .collect(Collectors.toList()); }
简化版本(条目本身就是Integer)
如果你的条目列表本身就是List<Integer>,那提取逻辑就是返回自身,方法可以简化:
private List<Integer> getRecentList(List<Integer> searchParams, Function<List<Integer>, List<Integer>> listGetter) { // 直接返回获取到的列表即可 return listGetter.apply(searchParams); // 要是想保留提取逻辑的扩展性,也可以加个Function<Integer, Integer>参数,比如传i -> i }
实际使用示例
假设你有个自定义的Order类,里面有getOrderId()方法返回Integer,咱们来调用这个方法:
// 自定义订单类 class Order { private Integer orderId; public Order(Integer orderId) { this.orderId = orderId; } public Integer getOrderId() { return orderId; } } // 调用示例 public void demo() { List<Integer> searchParams = Arrays.asList(1001, 1002, 1003); // 第一个Lambda:根据搜索参数获取订单列表(模拟从数据库查询) Function<List<Integer>, List<Order>> orderListGetter = params -> { List<Order> orders = new ArrayList<>(); for (Integer param : params) { orders.add(new Order(param)); } return orders; }; // 第二个Lambda:从订单中提取订单ID(用方法引用更简洁) Function<Order, Integer> orderIdGetter = Order::getOrderId; // 调用方法得到结果 List<Integer> recentOrderIds = getRecentList(searchParams, orderListGetter, orderIdGetter); }
参数解释
List<Integer> searchParams:你的搜索参数集合,会传给第一个Lambda用来筛选/获取条目Function<List<Integer>, List<T>> listGetter:第一个Lambda,负责接收搜索参数,返回对应的条目列表Function<T, Integer> idGetter:第二个Lambda,负责接收单个条目,提取出你需要的Integer值
内容的提问来源于stack exchange,提问作者arcy
相关产品推荐
相关产品推荐

