java - 如何生成由列表支持的 map

标签 java collections wrapper

我有一个如下所示的数据模型:

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/

相关文章:

java - 键值对的正则表达式,包括未转义的空格

java - Android 5.0 及更高版本上未显示 Firebase 通知图标

java - Java 中的排序列表,如 TreeMap 或 SortedSet

java服务包装器

python - 如何在 Python 的包装函数中使用任意函数

java - 在spring boot中使用openapi使用@Schema(allowableValues=)作为枚举参数

java - logback 未设置 Spring 日志记录阈值

c# - 使用泛型方法将继承的泛型类添加到字典

java - 用列表数据填充数组

c++ - 大数库的通用包装类