Skip to content

Instantly share code, notes, and snippets.

@nileshk
Created September 9, 2014 01:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nileshk/eed39ae9f7a8cb9caea5 to your computer and use it in GitHub Desktop.
Save nileshk/eed39ae9f7a8cb9caea5 to your computer and use it in GitHub Desktop.
Java 8 bean comparison static method using lambdas of getters to specify which properties to compare
package com.nileshk;
import java.util.function.Function;
import java.util.stream.Stream;
public class BeanCompareUtil {
public static <T> boolean compareBeans(T bean1, T bean2, Function<T, Object>... getters) {
return Stream.of(getters).allMatch(getter -> {
Object val1 = getter.apply(bean1);
Object val2 = getter.apply(bean2);
return (val1 == null && val2 == null) ||
(val1 != null && val1.equals(val2));
});
}
}
package com.nileshk;
import org.junit.Test;
import java.math.BigDecimal;
import static com.nileshk.BeanCompareUtil.compareBeans;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class BeanCompareUtilTest {
@Test
public void testCompareBeansTrue() {
BeanToTest bean1 = new BeanToTest("SomeString1", "AnotherString2", 256, 123.45, true);
BeanToTest bean2 = new BeanToTest("SomeString1", "AnotherString2", 256, 123.45, true);
assertTrue(compareBeans(bean1, bean2,
BeanToTest::getSomeString,
BeanToTest::getAnotherString,
BeanToTest::getSomeInteger,
BeanToTest::getSomeDouble,
BeanToTest::getSomeBoolean
));
}
@Test
public void testCompareBeansTrue_subsetOfGetters() {
BeanToTest bean1 = new BeanToTest("SomeString1", "AnotherString2", 256, 123.45, true);
BeanToTest bean2 = new BeanToTest("SomeString1", "AnotherString2", 256, 123.45, true);
assertTrue(compareBeans(bean1, bean2,
BeanToTest::getSomeString,
BeanToTest::getSomeInteger,
BeanToTest::getSomeBoolean
));
}
@Test
public void testCompareBeansTrue_nullString() {
BeanToTest bean1 = new BeanToTest("SomeString1", null, 0, 0.0, false);
BeanToTest bean2 = new BeanToTest("SomeString1", null, 0, 0.0, false);
assertTrue(compareBeans(bean1, bean2,
BeanToTest::getSomeString,
BeanToTest::getAnotherString,
BeanToTest::getSomeInteger,
BeanToTest::getSomeDouble,
BeanToTest::getSomeBoolean
));
}
@Test
public void testCompareBeansTrue_nullInteger() {
BeanToTest bean1 = new BeanToTest("SomeString1", "AnotherString2", null, 123.45, true);
BeanToTest bean2 = new BeanToTest("SomeString1", "AnotherString2", null, 123.45, true);
assertTrue(compareBeans(bean1, bean2,
BeanToTest::getSomeString,
BeanToTest::getAnotherString,
BeanToTest::getSomeInteger,
BeanToTest::getSomeDouble,
BeanToTest::getSomeBoolean
));
}
@Test
public void testCompareBeansTrue_nullDouble() {
BeanToTest bean1 = new BeanToTest("SomeString1", "AnotherString2", 128, null, true);
BeanToTest bean2 = new BeanToTest("SomeString1", "AnotherString2", 128, null, true);
assertTrue(compareBeans(bean1, bean2,
BeanToTest::getSomeString,
BeanToTest::getAnotherString,
BeanToTest::getSomeInteger,
BeanToTest::getSomeDouble,
BeanToTest::getSomeBoolean
));
}
@Test
public void testCompareBeansTrue_nullBoolean() {
BeanToTest bean1 = new BeanToTest("SomeString1", "AnotherString2", 128, 3.14, null);
BeanToTest bean2 = new BeanToTest("SomeString1", "AnotherString2", 128, 3.14, null);
assertTrue(compareBeans(bean1, bean2,
BeanToTest::getSomeString,
BeanToTest::getAnotherString,
BeanToTest::getSomeInteger,
BeanToTest::getSomeDouble,
BeanToTest::getSomeBoolean
));
}
@Test
public void testCompareBeansTrue_allNulls() {
BeanToTest bean1 = new BeanToTest(null, null, null, null, null);
BeanToTest bean2 = new BeanToTest(null, null, null, null, null);
assertTrue(compareBeans(bean1, bean2,
BeanToTest::getSomeString,
BeanToTest::getAnotherString,
BeanToTest::getSomeInteger,
BeanToTest::getSomeDouble,
BeanToTest::getSomeBoolean
));
}
@Test
public void testCompareBeansFalse_string() {
BeanToTest bean1 = new BeanToTest("SomeString1", "AnotherString2", 256, 123.45, true);
BeanToTest bean2 = new BeanToTest("SomeString1", "AnotherString3", 256, 123.45, true);
assertFalse(compareBeans(bean1, bean2,
BeanToTest::getSomeString,
BeanToTest::getAnotherString,
BeanToTest::getSomeInteger,
BeanToTest::getSomeDouble,
BeanToTest::getSomeBoolean
));
}
@Test
public void testCompareBeansFalse_stringNullFirst() {
BeanToTest bean1 = new BeanToTest("SomeString1", null, 256, 123.45, true);
BeanToTest bean2 = new BeanToTest("SomeString1", "AnotherString2", 256, 123.45, true);
assertFalse(compareBeans(bean1, bean2,
BeanToTest::getSomeString,
BeanToTest::getAnotherString,
BeanToTest::getSomeInteger,
BeanToTest::getSomeDouble,
BeanToTest::getSomeBoolean
));
}
@Test
public void testCompareBeansFalse_stringNullSecond() {
BeanToTest bean1 = new BeanToTest("SomeString1", "AnotherString", 256, 123.45, true);
BeanToTest bean2 = new BeanToTest("SomeString1", null, 256, 123.45, true);
assertFalse(compareBeans(bean1, bean2,
BeanToTest::getSomeString,
BeanToTest::getAnotherString,
BeanToTest::getSomeInteger,
BeanToTest::getSomeDouble,
BeanToTest::getSomeBoolean
));
}
protected class BeanToTest {
private String someString;
private String anotherString;
private Integer someInteger;
private Double someDouble;
private Boolean someBoolean;
public BeanToTest(String someString, String anotherString, Integer someInteger, Double someDouble, Boolean someBoolean) {
this.someString = someString;
this.anotherString = anotherString;
this.someInteger = someInteger;
this.someDouble = someDouble;
this.someBoolean = someBoolean;
}
public String getSomeString() {
return someString;
}
public void setSomeString(String someString) {
this.someString = someString;
}
public String getAnotherString() {
return anotherString;
}
public void setAnotherString(String anotherString) {
this.anotherString = anotherString;
}
public Integer getSomeInteger() {
return someInteger;
}
public void setSomeInteger(Integer someInteger) {
this.someInteger = someInteger;
}
public Double getSomeDouble() {
return someDouble;
}
public void setSomeDouble(Double someDouble) {
this.someDouble = someDouble;
}
public Boolean getSomeBoolean() {
return someBoolean;
}
public void setSomeBoolean(Boolean someBoolean) {
this.someBoolean = someBoolean;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment