首先,我有一个包含几个Object类型数组的列表,例如:
Object[] arr1 = new Object[] {"FIM4R1500030", BigInteger.valueOf(5272456l), "A10328E00074531842"};
Object[] arr2 = new Object[] {"FIM4R1500031", BigInteger.valueOf(886445384123l), "A10328E00074531842"};
final List<Object[]> arrs = Arrays.asList(arr1, arr2);
然后,我编写了一个逻辑,过滤它们以保留一致的值,并为不一致的填充null。结果看起来像这样:
List[
Object[][null,null,"A10328E00074531842"],
Object[][null,null,"A10328E00074531842"]
]
现在,我的问题是,这个逻辑变得相当复杂和难以阅读,我不确定我是否能忍受它。另外,我真的不想开始编写一个完整的实用程序类,因为功能似乎很小。这是我的代码:
final Predicate<Integer> isConsistant = index -> {
for (Object[] arr : arrs) {
if (!arr[index].equals(arrs.get(0)[index])) {
return false;
}
}
return true;
};
List<Object[]> filtered = arrs.stream().map(arr -> {
Object[] returnList = new Object[arrs.get(0).length];
for (int i = 0; i < arrs.get(0).length; i++) {
if (isConsistant.test(i)) {
returnList[i] = arrs.get(0)[i];
} else {
returnList[i] = null;
}
}
return returnList;
})
.collect(toList());
我的问题是,如何使这更简单!
答案 0 :(得分:1)
此代码的问题并不是它过于复杂,而是因为它不必要地慢:对于(row, column)
arrs
column
的每一对,你再次走完整个阵列,试图确定isConsistant
中的所有值是否彼此相等。实质上,您在同一列N
上运行N
- 每行一次,即使谓词始终返回相同的值。当行数很高时,这可能非常重要。
此过程始终以N
个相同的行结束,因此您也可以构造该行一次,然后制作Object[] row = new Object[arrs.get(0).length];
for (int i = 0 ; i != arrs.get(0).length ; i++) {
if (isConsistant.test(i)) {
row[i] = arrs.get(0)[i];
}
}
// Now we make N copies of that row:
List<Object[]> filtered = new ArrayList<Object[]>();
for (int i = 0 ; i != arrs.length() ; i++) {
filtered.add((Object[])row.clone());
}
个副本:
filtered
如果您不打算修改clone
的元素,则可以跳过N
部分,并插入相同的对象app.factory('Point', function () {
var data = {
point: 0
};
return {
getPoint: function () {
return data.point;
},
setPoint: function (point) {
data.point = point;
}
};
});
次。
答案 1 :(得分:1)
为什么您希望过滤器的结果为List<Object[]>
?如果我很好地理解了您的问题,那么该列表中的所有Object[]
看起来都是一样的。所以代码可能就是:
Object[] filtered = IntStream.range(0, arrs.get(0).length)
.mapToObj(i -> arrs.stream().allMatch(arr -> arr[i] != null && arr[i].equals(arrs.get(0)[i])) ? arrs.get(0)[i] : null)
.toArray();