java - 传入两个 lambda 函数

标签 java lambda

我想将两个 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 规范中保留第二个原始 List,因为不同的 getter 将在其列表中返回不同类型的对象。

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

回到示例,如果我有一个带有 getSupplierId() 的供应商类和一个带有 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调用中没有使用loop,说明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/

相关文章:

java - 为什么空格后面的所有内容都不打印?

java - Eclipse 在每次保存时构建所有类

lambda - 在Kotlin中生成带有Lambda的列表

c++ - lambda fct 返回引用

c# - Func<> 与 lambda 表达式

java - 将这两个 Java 流合并为一个

typescript - typescript 中的lambda表达式类型

java - Hibernate HQL NULL 比较模式

java - 日志记录由记录器处理两次

java - 将重复值添加到 map ,无需外部库