这里是一个办法做到这一点使用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
UPDATE
使用Set
是一个简单的解决方案,但它总是有t o扫描所有对象。
如果你有很多的对象,它可能是很好的性能为您找到不同的值,一旦停止扫描:
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);
}
不清楚你想要做什么。 “比较”和“预填充”如何结合在一起?您是否试图在数据库中以字段为单位预填表格中最常见的值? – Andreas
你可以编写你自己的比较器,它有'n'方法作为你需要比较的属性数量。我认为这是针对您的问题的简单解决方案。不要忘记,如果你有'm'对象,那么你将有'm'次验证。 – aribeiro
@Andreas是的,我试图预填充表单,只有当所有选择的对象都为该字段保留相同的值(所以表单可能有一些预填充的值,并为其他人留空)由于不清楚! – ec3