在 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;
});
我需要根据属性对一组对象 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;
});