dah*_*hui 2 java functional-programming java-8
我试图在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;
};
}
Run Code Online (Sandbox Code Playgroud)
我已经将它设置为静态,因此我可以在不实例化类的情况下调用它,如下所示:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
上面段中的最后一行给出了一个错误,指出apply(List)不能应用于参数ArrayList.我想知道解决这个问题的最佳方法是什么,所以我的函数能够获取整数的ArrayList,或者实际上是任何对象.
一个想法是使用Generics,但是我当时无法使用静态上下文中的函数,当我在ReverseListFunction的实例上更改要调用的函数时,它仍然是错误的,因为我提供的是ArrayList而不是List.
那么,解决这个问题的功能方式是什么呢?
您不需要创建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;
}
Run Code Online (Sandbox Code Playgroud)
并使用方法参考:
Function<List<Integer>, List<Integer>> reverseFunction = ReverseListFunction::reverseList;
Run Code Online (Sandbox Code Playgroud)
顺便说一句,要反转List,有一种方法可用Collections,您可以这样做:
Collections.reverse(myList);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
184 次 |
| 最近记录: |