作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Java 8 中编写一个 lambda 函数,该函数将采用任何对象的任何类型的列表。这个简单的函数将反转列表,关键是我希望这个函数获取任何对象的列表。函数/类如下:
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,或者实际上任何对象。
一个想法是使用泛型,但是我无法从静态上下文中使用该函数,并且当我更改要在 ReverseListFunction 实例上调用的函数时,它仍然出错,因为我提供的是 ArrayList,而不是一个列表。
那么,如果存在的话,解决这个问题的功能方式是什么?
最佳答案
您不需要创建 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;
顺便说一句,要反转列表,Collections
中有一个方法可用,您可以这样做:
Collections.reverse(myList);
关于Java函数式-反转ANY对象的ANY列表类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40019836/
我是一名优秀的程序员,十分优秀!