java 8/11中是否可以传递带有2个参数的函数作为另一个函数的参数?

时间:2018-12-31 13:52:16

标签: java generics java-8 functional-interface

我有这个问题。

我正在使用一些泛型,有一点我需要根据每种类型进行特定的转换。

所以,到目前为止,我有这个:

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 :(得分:4)

查看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);
}

为调用该函数,我们假设您有两个Integer列表,例如:

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

并且您想将它们串联起来,则需要同时传递列表和行为,例如

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

答案 1 :(得分:2)

您可以使函数采用java.util.function.BinaryOperator<T>,这是一个具有两个相同类型参数并返回相同类型结果的函数:

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