Java Functional - 反转任何列表类型的ANY对象

时间:2016-10-13 11:34:16

标签: 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;
    };

}

我已将其设为静态,因此我可以在不实例化类的情况下调用它,如下所示:

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而导致错误,而不是列表。

那么,解决这个问题的功能性方式是什么呢?

1 个答案:

答案 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);