基本上,我有一个表单,必须根据对象 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/