首先,我有一个包含多个对象类型数组的列表,例如:
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());
我的问题是,如何让这个变得更简单!
最佳答案
为什么你想要 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();
关于java - 过滤 List<Object[]> 以保留一致的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31787014/