我确实有两个java.util.List,例如看起来像这样:

List<MyObject> myObjects = ...
MyObject myObject1 = ...
MyObject myObject2 = ...
MyObject myObject3 = ...
MyObject myObject4 = ...
MyObject myObject5 = ...
myObjects.add(myObjet1);
...


第二个List看起来像这样:

List<MyObject> otherListObjects = ...
MyObject myObject1 = ...
MyObject myObject5 = ...


现在,我的目标是要有一个列表,其中myObject1和myObject5位于前两个位置,而不是其他位置。
在Java 8中是否可以执行此操作?

最佳答案

您可以根据myObjects中出现在myOtherObjects中的索引对它们进行排序:

myObjects.sort(Comparator.comparingInt(s -> {
    int ind  = myOtherObjects.indexOf(s);
    if (ind >= 0) {
        return ind;
    }
    return Integer.MAX_VALUE;
}));


马尔特·哈特维格(Malte Hartwig)提出了一个很酷的变体。它利用Java的整数算术下溢,因此,如果在myOtherObjects中找不到该对象,则将-1添加到Integer.MIN_VALUE将会下溢并产生2147483647

myObjects.sort(
    Comparator.comparingInt(s -> myOtherObjects.indexOf(s) + Integer.MIN_VALUE));


如果您不关心myOtherObjects内部的内部顺序,则可以大大简化此操作:

myObjects.sort(Comparator.comparing(myOtherObjects::contains).reversed());

10-04 10:23