К сожалению, присвоение неверно, потому что Function
должно быть объявлено как Function<D, R> function
, читайте его как «функцию, которая преобразуется из D в R»Реализация такого метода на самом деле довольно тривиальна:
@SuppressWarnings("unchecked")
public static <R, D> R[] map(Function<D, R> function, D[] array) {
return (R[]) Arrays.stream(array)
.map(function)
.toArray(Object[]::new);
}
с небольшой оговоркой.Создание универсального массива в java не допускается, , но объявление одного is, а также массивов covariant означает, что вы можете назначать один другому, в отличие, например, от generics.Один пример того, как вы будете использовать свой метод:
public static void main(String[] args) {
System.out.println(Arrays.toString(map(x -> x + 1, new Integer[] { 1, 2, 3 })));
}
РЕДАКТИРОВАТЬ
Читайте комментарии Дидье ниже, в основном то, что написано выше, неверно, я оставляю егов учебных целях (включая мою неудачу здесь).Вы можете сделать это, но вам нужно передать дополнительный метод этому методу, например:
public static <R, D> R[] map(Function<D, R> function, D[] array, IntFunction<R[]> func) {
return Arrays.stream(array)
.map(function)
.toArray(func);
}
Это очень похоже на ReferencePipeline::toArray
.
Другой вариант - вернуть Object[]
и затем использовать Arrays::copyOf
:
public static <R, D> Object[] map(Function<D, R> function, D[] array) {
return Arrays.stream(array)
.map(function)
.toArray();
}
Integer[] input = { 1, 2, 3, 4 };
Object[] obj = map(x -> x + 1, input);
Integer[] result = Arrays.copyOf(obj, obj.length, Integer[].class);