Created
September 9, 2014 01:52
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | |
}); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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