我正在尝试在Java中创建等效于Javascript的Array#map
。
我已经能够用
做到这一点ArrayList<String> data = myList.stream().map(e -> {
return "test "+e;
}).collect(Collectors.toCollection(ArrayList::new));
此处,myList
是最初的ArrayList
,data
是生成的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?
答案 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]