2 回答
TA贡献2041条经验 获得超4个赞
第一部分,您需要Class<R>为了动态创建数组R[]。我更愿意Arrays.toString实现我自己的版本。我还需要一个Function<D, R>(不是一个Function<R, D>)。但是做出这些改变就像
public static void main(String[] args) {
Function<Integer, Integer> function = new CalculateSuccessor();
Double[] d = { 2.0, 4.0, 8.0 };
Integer[] i = { 2, 4, 8 };
System.out.println(Arrays.toString(map(Integer.class, function, i)));
}
public static <R, D> R[] map(Class<R> cls, Function<D, R> function, D[] array) {
ArrayList<R> list = new ArrayList<>();
for (D element : array) {
list.add(function.apply(element));
}
return list.toArray((R[]) Array.newInstance(cls, list.size()));
}
我得到
[4, 8, 16]
TA贡献1790条经验 获得超9个赞
您可以从 中提取类型信息,Function<D,R>因为您使用实际类实现了它。所以与@Elliott Frisch 一起回答。
public static <R, D> R[] map(Function<D, R> function, D[] array) {
ArrayList<R> list = new ArrayList<>();
for (D element : array) {
list.add(function.apply(element));
}
Class<?> componentClass = extractReturnType(function)
return list.toArray((R[]) Array.newInstance(componentClass, list.size()));
}
private static Class<?> extractReturnType(Function<?, ?> function) {
Type[] interfaces = function.getClass().getGenericInterfaces();
for(Type iface:interfaces) {
if (iface instanceof ParameterizedType && Function.class.equals(((ParameterizedType) iface).getRawType())) {
return (Class<?>) ((ParameterizedType) iface).getActualTypeArguments()[1];
}
}
throw new IllegalArgumentException("Unable to extract type information");
}
- 2 回答
- 0 关注
- 133 浏览
添加回答
举报