Создание функции карты в Java, которая принимает массив и функцию в качестве входных данных - PullRequest
0 голосов
/ 10 октября 2018

Я ищу создание в Java функции, которая принимает другую функцию и массив в качестве входных данных и выводит массив, в котором каждый элемент в исходном массиве был пропущен через функцию ввода.

задание, которое мне дали, говорит, что оно хочет, чтобы функция карты имела следующую подпись.

public static <R, D> R[] map(Function<R, D> function, D[] array)

Назначение также дает несколько примеров, которые я скопировал в виде текста ниже, поскольку сайт не позволяетя включаю скриншот еще.

// Example 1
Function<Integer, Integer> function = new CalculateSuccessor();
Integer[] integerArray = {1, 3, 4, 2, 5};
PrintArray(map(function, integerArray)); // map returns {2, 4, 5, 3, 6}

// Example 2
Function<Integer, String> anotherFunction = new CalculateLength();
String[] stringArray = { "Java", "C++", "Smalltalk" };
PrintArray(map(anotherFunction, stringArray)); // map returns {4, 3, 9}

// Example 3
Function<Double, Double> tripleFunction = new CalculateTriple();
Double[] doubleArray = { 2.0, 4.0, 5.0, 1.0 };
PrintArray(map(tripleFunction, doubleArray)); // map returns {6.0, 12.0, 15.0, 3.0}

Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 10 октября 2018

К сожалению, присвоение неверно, потому что 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...