java - 使用对象和接口(interface)从 Map 对象获取 key

标签 java interface guava

我有一个 Table 类,它实现了某种类型对象的 ForwardingMultimap。我想知道创建一个从对象中提取 key 的接口(interface)是否过度,这样调用者在调用“值”时处理“条目”对象就不会很烦人。或者让调用者将对象和 key 放入自己中会更好吗?如果可以的话,创建一个单独的类来处理每个键(如下所示)会更好,还是调用者应该自己实现它?

public class CustomObject {
    public String propertyOne;
    public int propertyTwo;

}

public interface ITableAggKey {
    Object getKey(CustomObject customObj);
}

public class Table extends ForwardingMultimap<Object, CustomObject> {
    Multimap m_map;
    public Table(ITableAggKey aggKey){
        m_map = HashMultimap.create();
        m_aggKey = aggKey;
    }
    public boolean put(CustomObject obj) {
        m_map.put(m_aggKey.getKey(obj), obj);
    }
}

public class CustomObjectAggKeys {
    public static final aggKeyOne = new ITableAggKey(){
        @Overide
        public Object getKey(CustomObject obj){
            return obj.propertyOne;
        }
    };

    public static final aggKeyOne = new ITableAggKey(){
        @Overide
        public Object getKey(CustomObject obj){
            return obj.propertyTwo;
        }
    };
}

最佳答案

public class Table<K, T> extends ForwardingMultimap<K, T> {
    Multimap<K, T> m_map;
    Function<T, K> m_aggKey;
    public Table(Function<T, K> aggKey){
        m_map = HashMultimap.create();
        m_aggKey = aggKey;
    }
    public boolean put(T obj) {
        m_map.put(m_aggKey.apply(obj), obj);
    }
}

public static void main(String[] args) {
    Table<String, CustomObject> IndexOne = new Table<>(x -> x.propertyOne);
    Table<Integer, CustomObject> IndexTwo = new Table<>(x -> x.propertyTwo);
}

如果您无法使用Java8。添加函数接口(interface)。

public interface Function<T, K> {
    K apply(T arg);
}

    Table<String, CustomObject> indexOne = new Table<>(new Function<CustomObject, String>() {
        @Override public String apply(CustomObject obj) {
            return obj.propertyOne;
        }
    });

关于java - 使用对象和接口(interface)从 Map 对象获取 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34426288/

相关文章:

java - 空白的 final 字段 conn 可能尚未在非 final 成员上初始化

C# 接口(interface)。不指定派生类名

Java:合并两个 com.google.common.collect.Table

java - 从 DER 获取 ASN1 声明

java - 如何使用 xjc 和自定义绑定(bind)生成 XMLElementWrapper 注释

interface - GraphQL 如何避免输入和输出类型之间的重复代码

java - Sets.CartesianProduct 与 GWT 不兼容

java - 使用 Guava 中的 Iterables 的 ClassCastException

java - SQLiteDatabase android 中的特殊字符

java - 我如何在 JSP 页面中获取任何字符串值