我有一个如下所示的数据模型:
class CustomField {
String key;
String value;
}
通过 API,我可以获得 List<CustomField>
的实例。键在列表中是唯一的,这意味着这个集合确实应该是 Map<String, String>
。在此列表上进行操作很痛苦,因为每个操作都需要迭代来检查现有键(CustomField 也没有实现 equals)
如何创建 Map<String, String>
“ View ”受此列表支持,以便我可以使用 Map 界面对其进行操作?
我想要一个通用方法,例如:<T, K, V> Map<K, V> createMapBackedByList(List<T> list, BiFunction<K, V, T> elementMapper, Function<T, K> keyMapper, Function<T, V> valueMapper)
或类似的。
它将使用函数在列表元素与映射键和值之间进行映射。
这里重要的是我希望对 map 的更改反射(reflect)在底层列表中,这就是 Streams API 在这里不起作用的原因......
编辑:我无法修改 API 或 CustomField 类。
最佳答案
简单:
自己写
public class ListBackedMap<K, V> implements Map<K, V> {
这需要某种List<Pair<K,V>>
关于创作;并“服从”这一点。当然,这需要您的CustomField
类实现 Pair
界面。 (您可能也需要发明它)
(或者:您的新类 extends AbstractMap<K,V>
以保护您的大部分工作)。
现在您的方法只需返回此类 Map 的实例。
换句话说:我不知道有哪个内置包装器可以满足您的要求。但自己实现一个应该非常简单。
编辑:鉴于OP无法更改CustomField
类,一个简单的助手,例如
interface <K, V> MapEntryAdapter {
K getKey();
V getValue();
}
是必需的;与知道如何从 CustomField
实例检索键/值的特定实现一起。在这种情况下, map 将由 List<MapEntryAdapter<K, V>>
支持。反而。
关于java - 如何生成由列表支持的 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43803670/