传递lambda函数作为参数

Zen*_*noo 2 java parameters lambda function java-8

我正在尝试Array#map用Java 创建一个与Javascript相同的东西.

我已经能够做到这一点

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

在这里,myList是最初的ArrayList,data是结果ArrayList.

但是,我发现每次这样做都非常繁琐.

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

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

然后调用它:

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

但是我得到了错误

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

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

Era*_*ran 10

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

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

使用List界面而不是ArrayList:

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

用法示例:

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

输出:

[test 1, test 2, test 3, test 4]
Run Code Online (Sandbox Code Playgroud)