在 lambda 中使用数组 (java)

Using an array in lambda (java)

我需要根据属性对一组对象 myArray 进行排序。排序依据的属性由用户提供,因此我将它们存储在 int [] attToSortBy 中。 然后我使用 for 循环遍历 attToSortBy 中的属性,其中我使用 lambda 为每个属性创建一个比较器,然后用它对 myArray 进行排序。 问题是我需要 attToSortBy 从我的对象中获取正确的属性,所以我需要在 lambda 中使用它。在用用户输入填充后,我没有更改 attToSortBy,但编译器引发了 variables in lambda must be effectively final 错误。然后我尝试了这个:

final int[] attToSortByFinal=attToSortBy;

它仍然抛出同样的错误。如何将 attToSortBy 放入我的 lambda 中?下面是 for 循环和 lambda:

for (int i=attToSortBy.length;i>0;i--){
                Comparator<myObject> comp=(myObject a, myObject b) -> 
                    {return (int)(a.get(attToSortByFinal[i]))-(int)(b.get(attToSortByFinal[i]));};
}

您可以将属性存储在 lambda 外部的闭包中。您不需要创建 final 副本。并确保您的循环索引正确。

for (int i=attToSortBy.length-1;i>=0;i--){
                String attr = attToSortBy[i]
                Comparator<myObject> comp=(myObject a, myObject b) -> 
                    {return (int)(a.get(attr))-(int)(b.get(attr));};
}

是变量i导致的错误,在循环中声明int j = i,然后使用j作为索引可以避免错误。而且我认为将比较循环放在比较器中更合适,示例排序代码如下:

Collections.sort(list, (myArray1, myArray2) -> {
    int compareResult = 0;
    for (int i = 0; i < myArray1.attrToSortBy.length; i++) {
//        if (myArray1.attrToSortBy[i] > myArray2.attrToSortBy[i]) {
//            compareResult = 1;
//        } else if (myArray1.attrToSortBy[i] == myArray2.attrToSortBy[i]) {
//            compareResult = 0;
//        } else {
//            compareResult = -1;
//        }
        compareResult = Integer.compare(myArray1.get(myArray1.attrToSortBy[i]), myArray2.get(myArray2.attrToSortBy[i]));
        //return compare result if it's not equal
        if (compareResult != 0) return compareResult; 
    }
    return compareResult;
});