gpt4 book ai didi

java - 传入两个 lambda 函数

转载 作者:行者123 更新时间:2023-11-30 06:44:55 26 4
gpt4 key购买 nike

我想将两个 lambda 表达式(或类似的东西,我仍然熟悉所有术语)传递到一个方法中;第一个将获得项目列表,第二个将从这些项目(每一个)中检索一个 Integer 对象。

所以我想要一个类似这样的方法:

private List<Integer> getRecentList(List<Integer> searchParams, 
Function<List<Integer>, List<Integer>> listGetter,
Supplier<Integer> idGetter)
{
List<Object> objectList = listGetter.apply(searchParams);
List<Integer> idList = new ArrayList<>();
for (Object o: objectList)
{
idList.add(idGetter.get());
}
return idList;
}

并这样调用它:

List<Integer> idList = setRecentList(searchParams, 
(a) -> serviceOne.getItemList(a),
Item::getItemId);

因此,第一个函数是在被调用方法可以访问的实例变量上调用的,第二个函数是在第一个函数作为列表返回的任何一个对象上的实例方法。

但是 (eclipse) 编译器不喜欢 Item::getItemId,不管结尾有没有括号。

我只是语法有问题,还是这个想法有其他问题?


在收到许多有用的评论后进行编辑——感谢大家!

我还有一个问题。我现在有一个方法,我认为它可以满足我的要求,但我不确定如何传递第二个表达式来调用它。方法如下:

private List<Integer> getRecentList(List<Integer> salesCodeIdList,
Function<List<Integer>, List> listGetter,
Function<Object, Integer> idGetter
) {
List<Object> objectList = listGetter.apply(salesCodeIdList);
List<Integer> idList = new ArrayList<>();
for (Object o : objectList) {
idList.add(idGetter.apply((o)));
}
return idList;
}

据我所知,我必须在 getter 规范中保留第二个原始列表,因为不同的 getter 会在其列表中返回不同类型的对象。

但我仍然不知道如何调用它——我想传递一个从对象的特定实例获取 id 的方法,即,我想在返回的对象之一的 ID 上传递一个 getter通过 listGetter。那将是不同类型的对象在不同的​​调用中。我将如何调用它?

回到示例,如果我有一个带有 getSupplierId() 的 Supplier 类和一个带有 getVendorId() 的 Vendor 类,并且我无法更改这些类,我能否传递正确的方法来调用列表取决于哪个 getter 检索列表?

最佳答案

出现错误的一个可能原因隐藏在方法的实现中:

private List<Integer> getRecentList(List<Integer> searchParams, 
Function<List<Integer>, List<Object>> listGetter,
Supplier<Integer> idGetter)
{
List<Object> objectList = listGetter.apply(searchParams);
List<Integer> idList = new ArrayList<>();
for (Object o: objectList)
{
idList.add(idGetter.get()); // <<<<<==== Here
}
return idList;
}

注意如何 o来自 for调用中没有使用循环,表示idGetter会凭空给你一个身份证。这当然不是真的:你需要将一个项目传递给 idGetter , 这意味着调用应该是

idList.add(idGetter.apply(o));

(from the comment) I can't cast within the method, I don't know what type of object to cast to there.

这反过来意味着idGetter应该是 Function<Object,Integer> :

for (Object o: objectList)
{
idList.add(idGetter.apply(o));
}

由于您希望对不同类型的列表重用相同的函数,因此调用必须使用在调用方执行转换的 lambda,即在您知道类型的地方:

List<Integer> idList = setRecentList(searchParams, 
(a) -> serviceOne.getItemList(a),
(o) -> ((Item)o).getItemId());

关于java - 传入两个 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49928090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com