java - 比较 n 个对象的多个字段的共同值

标签 java mysql spring hibernate comparator

基本上,我有一个表单,必须根据对象 ID 选择中的公共(public)字段值来预填充该表单。例如。我有一个有 4 个字段的对象(a、b、c、d,可能更多)。如果选择了 id 1、2、3(可能超过 3)的对象,我应该如何比较每个选定对象的所有字段,以便使用通用值预填充表单?

我研究了 Comparator 类,但它看起来像是同时比较两个对象(可能是多个字段),这意味着如果我选择了 n 个对象,则可能意味着大量循环?

我还考虑过使用 unique 进行 sql select,然后根据返回的行数我会知道字段值是否相同。然而,这意味着我必须进行尽可能多的 sql 不同调用,因为有些字段听起来也很麻烦,而且事实上我将在数据库而不是应用程序中执行逻辑......

我正在使用 hibernate、spring 和 java,所以我想知道我是否缺少一个可以执行类似操作的功能?

目前我正在使用类似的东西

CollectionUtils.collect(objectList,TransformerUtils.invokerTransformer("getA")); 

对每个表单字段执行此操作,然后检查数组中是否有重复值,这似乎根本不是最佳选择...

任何帮助/提示将不胜感激!

最佳答案

以下是使用 Java 8 流执行此操作的方法:

public class Test8 {
    public static void main(String[] args) {
        MyObj[] testData = {
                new MyObj(1, "X", 3.14, "Larry"),
                new MyObj(2, "X", 3.14, "Curly"),
                new MyObj(3, "X", 3.14, "Moe"),
        };
        System.out.println("A = " + findCommon(testData, MyObj::getA).orElse(null));
        System.out.println("B = " + findCommon(testData, MyObj::getB).orElse(null));
        System.out.println("C = " + findCommon(testData, MyObj::getC).orElse(null));
        System.out.println("D = " + findCommon(testData, MyObj::getD).orElse(null));
    }
    private static <T, R> Optional<R> findCommon(T[] data, Function<? super T, ? extends R> getterMethod) {
        Set<R> values = Arrays.stream(data)
                              .map(getterMethod)
                              .collect(Collectors.toSet());
        return (values.size() == 1
                ? Optional.ofNullable(values.iterator().next())
                : Optional.empty());
    }
}
class MyObj {
    private final int    a;
    private final String b;
    private final double c;
    private final String d;
    MyObj(int a, String b, double c, String d) {
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
    }
    public int getA() {
        return this.a;
    }
    public String getB() {
        return this.b;
    }
    public double getC() {
        return this.c;
    }
    public String getD() {
        return this.d;
    }
}

输出

A = null
B = X
C = 3.14
D = null
<小时/>

更新

使用Set是一个简单的解决方案,但它始终必须扫描所有对象。

如果您有很多对象,一旦发现不同的值就停止扫描可能对性能有好处:

private static <T, R> Optional<R> findCommon(T[] data, Function<? super T, ? extends R> getterMethod) {
    R onlyValue = null;
    for (T obj : data) {
        R value = getterMethod.apply(obj);
        if (value == null)
            return Optional.empty();
        if (onlyValue == null)
            onlyValue = value;
        else if (! value.equals(onlyValue))
            return Optional.empty();
    }
    return Optional.ofNullable(onlyValue);
}

关于java - 比较 n 个对象的多个字段的共同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35514423/

相关文章:

java - 调整服务器上图像的大小以适应各种设备

Java 过滤字符串中的 url?

java - 方法无故关闭程序

mysql - 如何为示例库编写触发器

java - 在 Hibernate 中使用 PreUpdate 监听器时记录未更新

php mysql 按 View 显示

javascript - JQuery 在 Ajax 函数后删除表格行

Java-TimerTask-org.hibernate.HibernateException : No Session found for current thread

java - Eclipse:添加 javadoc

eclipse - 智能 : Keep junit running during Integration Testing