Можно ли передать функцию с 2 параметрами в качестве параметра для другой функции в Java 8/11? - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть эта проблема.

Я работаю с некоторыми обобщениями, и в какой-то момент мне понадобится конкретное преобразование в зависимости от каждого типа.

Итак, пока у меня есть это:

public static <T> List<T> myMethod(List<T> list1, List2<T>, SomeFunction converter) { 
//... do suff
return converter.convert(list1, list2);

}

и конвертер будет выглядеть так:

public <T> List<T> converter(List<T> list1, List<T> list2) {
/// cast and do stuff)
return List<T> some stuff;
}

Тогда я бы хотел позвонить, как

myMethod<list1,list2,converter);

Я знаю о функциональном интерфейсе Function но мне нужно отправить два параметра для этого, есть ли способ сделать это в Java8 / 11?

Идеи?

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Вы можете заставить вашу функцию принимать java.util.function.BinaryOperator<T>, которая является функцией, которая принимает два параметра одного типа и возвращает результат того же типа:

public static <T> List<T> (List<T> list1, List<T>, 
                    BinaryOperator<List<T>> converter) { 
    return converter.apply(list1, list2);
}
0 голосов
/ 31 декабря 2018

Посмотрите на BinaryOperator, которая представляет операцию над двумя операндами одного и того же типа, которая дает результат того же типа, что и операнды.

public static <T> List<T> someMethodName(List<T> list1, List<T> list2,  
             BinaryOperator<List<T>> converter) { 
    return converter.apply(list1, list2);
}

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

public static <T, R> List<R> someMethodName(List<T> list1, List<T> list2,
            BiFunction<List<T>, List<T>, List<R>> converter) {
    return converter.apply(list1, list2);
}

Для вызова функции предположим, что у вас есть два списка целых чисел, например sakes:

List<Integer> first = ....
List<Integer> second = ....

и вы хотите объединить их, вы передадите оба списка и поведение, например

List<Integer> concat = someMethodName(first, second, 
                       (l, r) -> Stream.concat(l.stream(), r.stream())
                       .collect(Collectors.toList()));
...