java - 过滤 List<Object[]> 以保留一致的值

标签 java arrays java-8 java-stream

首先,我有一个包含多个对象类型数组的列表,例如:

    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/

相关文章:

java - 在 Eclipse 插件项目中使用来自普通旧 Java 项目的包

c# - 索引越界。如何解决

JavaScript:阻止 Array.push()

java - 坚持使用 java8 lambda 表达式

java - Lambda 表示法 - 尝试重构但遇到问题

java - 为什么我的 Android 应用程序在连接到 mqtt 代理时给出 "your app keeps stopping"

java - EJBQL/MySQL 正则表达式和 IN

java - 将枚举存储在数据库中

python - 在 python numpy 中创建动态数组名称

java - 如何使用 Java 8/stream API 列出、映射和 "print if count>0"?