我正在尝试在Java 8中编写一个lambda函数,该函数将采用任何对象的任何类型的List。这个简单的函数会反转一个列表,关键是我希望这个函数能够获取任何对象的列表。函数/类如下:
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
public abstract class ReverseListFunction {
// function which reverses a list
public static Function<List<Object>, List<Object>> reverseList = (List<Object> l) -> {
int midPoint = endIndex/2;
for (int i = endIndex; i > midPoint; i-- ) {
Object temp = l.get(i);
int distanceFromEndIndex = endIndex - i;
l.set(i, l.get(distanceFromEndIndex));
l.set(distanceFromEndIndex, temp);
}
return l;
};
}
我已将其设为静态,因此我可以在不实例化类的情况下调用它,如下所示:
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
List<Integer> ints = new ArrayList<>();
for (int i = 0; i < 100; i++ ) {
// int i is cast to Integer and added to ints
ints.add(i);
}
// This line prevents compilation
ints = ReverseListFunction.reverseList.apply(ints);
}
}
上面段中的最后一行给出了一个错误,指出apply(List)不能应用于参数ArrayList。我想知道解决这个问题的最佳方法是什么,所以我的函数能够获取整数的ArrayList,或者实际上是任何对象。
一个想法是使用Generics,但是当时我无法使用静态上下文中的函数,当我在ReverseListFunction的实例上更改要调用的函数时,它仍然会因为我提供的是ArrayList而导致错误,而不是列表。
那么,解决这个问题的功能性方式是什么呢?
答案 0 :(得分:5)
您不需要创建lambda来创建Function对象。您可以在类中创建静态方法并使用方法引用:
public static <T> List<T> reverseList(List<T> l) {
int endIndex = l.size() - 1;
int midPoint = endIndex/2;
for (int i = endIndex; i > midPoint; i-- ) {
T temp = l.get(i);
int distanceFromEndIndex = endIndex - i;
l.set(i, l.get(distanceFromEndIndex));
l.set(distanceFromEndIndex, temp);
}
return l;
}
并使用方法参考:
Function<List<Integer>, List<Integer>> reverseFunction = ReverseListFunction::reverseList;
顺便说一下,为了反转一个List,Collections
中有一个方法,你可以这样做:
Collections.reverse(myList);