传递lambda函数作为参数

时间:2018-05-16 07:56:58

标签: java function lambda parameters java-8

我正在尝试在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]方法图(ArrayList,Function)中的   类型DEF不适用于参数(List,(   e) - &gt; {})

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

1 个答案:

答案 0 :(得分: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));
}

最好使用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]