我想比较两个在运行时可能为null的给定对象。在我的例子中:
@Test
public void shouldCompareAgents() {
Agent a1 = new Agent();
a1.setId("4711");
a1.setType(null);
Agent a2 = new Agent();
a2.setId(a1.getId());
a2.setType(a1.getType());
assertEquals("Agent.getId", 0,
Comparator.comparing(Agent::getId).compare(a1, a2));
assertEquals("Agent.getType", 0,
Comparator.comparing(Agent::getType).compare(a1, a2));
}
id的断言工作正常,按类型不是a1.getType()
为空。有办法避免这种情况吗?我试过了Comparator.nullsLast(...)
,但这没有任何意义,因为我没有在这里对元素进行排序。
我有很多断言要做,所以我更喜欢"单行" 。我是lambda表达的新手。
答案 0 :(得分:12)
如果您只是想在JUnit测试中使用它,为什么不直接将要比较的对象传递给assertEquals
方法?
assertEquals("Agent.getId", a1.getId(), a2.getId());
这也有助于JUnit在测试失败时生成有用的错误消息。
如果您想在生产代码中执行此操作,可以使用Objects.equals
:
if (Objects.equals(a1.getId(), a2.getId())) { ... }
自Java 7以来就存在。
答案 1 :(得分:10)
这样的事情:
Comparator.comparing(Agent::getType,
Comparator.nullsLast(Comparator.naturalOrder()))
由于您需要在更多地方使用它,您可以将其解压缩为:
private static <R, T extends Comparable<T>> boolean areEqual(R left, R right, Function<R, T> function) {
return Comparator.comparing(
function,
Comparator.nullsLast(Comparator.naturalOrder()))
.compare(left, right) == 0;
}
答案 2 :(得分:5)
您可以使用Objects.equals
:
assertEquals("Agent.getId", true,
Objects.equals(a1.getID(),a2.getID());
assertEquals("Agent.getType", true,
Objects.equals(a1.getType(),a2.getType());
Objects.equals
为您处理null
。