Передача лямбда-функции в качестве параметра - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь создать эквивалент Java Array#map в Java.

Я смог сделать это с помощью

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) -> {})

Как я могу отредактировать свою универсальную функцию для принятия лямбда-выраженияЯ пользуюсь?

1 Ответ

0 голосов
/ 16 мая 2018

Вы должны определить свой метод с двумя параметрами общего типа - типом элемента исходного списка и типом элемента целевого списка:

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