【发布时间】:2020-07-02 22:28:29
【问题描述】:
我一直在使用以下名为City 的类
@ToString
@AllArgsConstructor
public class City {
Integer id;
String name;
}
并尝试将其转换为名为@987654324@ 的record
record CityRecord(Integer id, String name) {} // much cleaner!
但是转向这样的表示,我们的一个单元测试开始失败。测试在内部处理从 JSON 文件读取的城市列表并映射到进一步计算城市的对象,同时将它们分组到 Map 下。简化为:
List<City> cities = List.of(
new City(1, "one"),
new City(2, "two"),
new City(3, "three"),
new City(2, "two"));
Map<City, Long> cityListMap = cities.stream()
.collect(Collectors.groupingBy(Function.identity(),
Collectors.counting()));
上面的代码断言 true 包含 4 个键,每个键占其出现的 1 个。使用记录表示,生成的Map 中的键不超过 3 个。是什么原因造成的,应该采取什么方法来解决这个问题?
【问题讨论】:
-
附带说明,使用
@lombok.EqualsAndHashCode public class City也不能解决问题!学习——必须有单元测试! -
Lombok 代码没有将 (Integer id, String name) 对建模为数据;它只是自动化一些语法样板。它缺少适当的 equals/hashCode 方法,因此它不会根据它们的状态考虑两个
(id, name)等价物。记录确实如此。当然,这取决于你想要什么。在大多数情况下,Lombok 版本可能已“损坏”,但您没有说明您的要求,因此我们无法知道。
标签: java compatibility java-14 java-record