這裏是一個辦法做到這一點使用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