【问题标题】:Passing a lambda function as a parameter将 lambda 函数作为参数传递
【发布时间】:2018-10-26 04:16:27
【问题描述】:

我正在尝试在 Java 中创建等效于 Javascript 的 Array#map

我已经能够做到这一点

ArrayList<String> data = myList.stream().map(e -> {
    return "test "+e;
}).collect(Collectors.toCollection(ArrayList::new));

这里,myList 是初始 ArrayListdata 是结果 ArrayList

但是,我发现每次都这样做非常乏味。

所以我尝试创建一个通用函数,让我的生活更轻松:

public static ArrayList<?> map(ArrayList<?> list, Function<? super Object,?> callback){
    return list.stream().map(callback).collect(Collectors.toCollection(ArrayList::new));
}

然后调用它:

ArrayList<String> data = DEF.map(myList,e -> {
    return "test "+e;
});

但我得到了错误

[Java] 中的方法 map(ArrayList, Function) DEF 类型不适用于参数(列表,( e) -> {})

如何编辑我的通用函数以接受我正在使用的 lambda?

【问题讨论】:

  • 啊,它在抱怨 ListArrayList。您应该对接口进行编程,即将参数更改为List&lt;?&gt;

标签: java function lambda parameters java-8


【解决方案1】:

您应该使用两个泛型类型参数定义您的方法 - 源列表的元素类型和目标列表的元素类型:

public static <S,T> ArrayList<T> map(ArrayList<S> list, Function<S,T> callback)
{
    return list.stream().map(callback).collect(Collectors.toCollection(ArrayList::new));
}

最好使用List接口而不是ArrayList

public static <S,T> List<T> map(List<S> list, Function<S,T> callback)
{
    return list.stream().map(callback).collect(Collectors.toList());
}

使用示例:

List<Integer> myList = Arrays.asList (1,2,3,4);
List<String> datai = map(myList ,e -> "test " + e);

输出:

[test 1, test 2, test 3, test 4]

【讨论】: