【发布时间】:2017-05-05 11:21:00
【问题描述】:
我有一个如下所示的数据模型:
class CustomField {
String key;
String value;
}
从我可以获取List<CustomField> 实例的API。键在列表中是唯一的,这意味着该集合确实应该是 Map<String, String>。在这个列表上操作很痛苦,因为每个操作都需要迭代来检查现有的键(CustomField 也没有实现 equals)
如何创建由该列表支持的Map<String, String>“视图”,以便使用地图界面对其进行操作?
我想要一个通用方法,例如:<T, K, V> Map<K, V> createMapBackedByList(List<T> list, BiFunction<K, V, T> elementMapper, Function<T, K> keyMapper, Function<T, V> valueMapper) 或类似方法。
它将使用函数在列表元素和映射键和值之间进行映射。
这里重要的是,我希望对地图的更改能够反映在底层列表中,这就是 Streams API 在这里不起作用的原因......
编辑:我无法修改 API 或 CustomField 类。
【问题讨论】:
-
为什么不直接从
List<CustomField>创建一个Map<String,String>,然后在完成后将其转回List?你真的需要直接改变底层结构吗? -
大概你可以通过
map.values()得到一个map的值列表。 -
您可以编写一个新的
Map实现,可能扩展AbstractMap。 -
创建比较器以按自定义字段的键进行排序。然后使用集合的 binarySearch 来查找是否存在特定的 customField。
-
@Jack 这是可能的,但我想要一些可重复使用且不需要我再次写回更改的东西。
标签: java collections wrapper