java - 如何使用对象属性作为方法参数来设置映射键?

标签 java generics lambda

我想要一个将 List 映射到 NavigableMap 的方法。方法调用需要一个用作映射键的参数。该参数是列表对象的一个​​属性。

像这样,所以两个调用都可以:

List<MyObject> list = new ArrayList<>();

NavigableMap<String, MyObject> stringKeyMap = asNavMap(list, MyObject:.getString());
NavigableMap<Date, MyObject>   dateKeyMap   = asNavMap(list, MyObject::getDate());

我不知道如何定义第二个参数 (MyObject::getDate())。我是否必须使用 lambda 表达式 (p -> p.getDate()) 或 Predicate 或 Function 之类的表达式?

我试图从 http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html 的方法 8(或类似方法)中得出解决方案, 但我不知道该怎么做。

这是我到目前为止所做的:

具体实现:

public class ConcreteConverter {

    public static NavigableMap<Integer, Pair<Integer, String>> asNavMap(List<Pair<Integer, String>> pairs) {
        NavigableMap<Integer, Pair<Integer, String>> navMap = new TreeMap<>();
        for (Pair<Integer, String> pair : pairs) {
            navMap.put(pair.getKey(), pair);
        }
        return navMap;
    }

    public static void main(String[] args) {
        List<Pair<Integer, String>> pairs = new ArrayList<>();
        pairs.add(new Pair<Integer, String>(1, "one"));

        NavigableMap<Integer, Pair<Integer, String>> map = ConcreteConverter.asNavMap(pairs);
    }
}

class Pair<K, V> {
    K   key;
    V   val;
    // constructor, getter, setter
}

我卡在这里(??? 是 Pair 对象的一个​​属性):

public static <K, V> NavigableMap<K, V> asNavMap(List<V> items, ???) {
    NavigableMap<K, V> navMap = new TreeMap<>();
        for (V item : items) {
            navMap.put(???, item);
        }
        return navMap;
}

请注意,我几乎没有编写通用方法或使用 lambda 函数/接口(interface)的经验。

感谢任何帮助。

编辑 1

正如 Nick Vanderhofen 提到的,我没有阐明对通用解决方案的搜索。

最佳答案

您可以使用函数来做到这一点。你保留你想要的代码:

List<MyObject> list = new ArrayList<>();

NavigableMap<String, MyObject> stringKeyMap = asNavMap(list, MyObject::getKey);

然后 asNavMap 方法可以接受一个函数:

private NavigableMap<String,MyObject> asNavMap(List<MyObject> list, Function<MyObject, String> getKey) {
   //the actual mapping goes here
}

您指定的 getKey 方法可以是 MyObject 上的简单 getter:

public String getKey(){
    return key;
}

或者您可以创建一个静态方法来获得相同的结果:

public static String getKey(MyObject myObject){
    return myObject.getKey();
}

要应用该函数,您只需使用 apply 方法:

String key = getKey.apply(someObject);

对于实际的映射实现,您可以保留 for 循环,或者您可以使用 java 8 重写它并重新使用您获得的函数作为收集器中的参数。但是,由于您需要一个 TreeMap,因此语法非常冗长:

items.stream().collect(Collectors.toMap(mapper, Function.identity(), (a,b) -> a, TreeMap::new));

关于java - 如何使用对象属性作为方法参数来设置映射键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40625780/

相关文章:

java - JTable 编辑器中的键绑定(bind)

java - 从递归解构建最大子数组动态规划解

c# - 在 stucturemap 的嵌套容器中注册通用接口(interface)和实现

swift - 如何在 Swift 中使用泛型正确实现提供者逻辑

java - 需要不兼容的类型

java - 是否可以在 Java 8 中调试 Lambda

java - 使用 Spring Security 自定义客户端身份验证的 OAuth2 错误响应

java - 如何在WebFilter中测试请求的HTTP方法?

scala - 如何构建泛型类型的匿名实例?

FilenameFilter 的 java 8 lambda 表达式