Java 如何使用对象属性作为方法参数来设置贴图键?

Java 如何使用对象属性作为方法参数来设置贴图键?,java,generics,lambda,Java,Generics,Lambda,我希望有一个将列表映射到NavigableMap的方法。方法调用需要一个用作映射键的参数。此参数是列表对象的属性 这两个电话都可以: List<MyObject> list = new ArrayList<>(); NavigableMap<String, MyObject> stringKeyMap = asNavMap(list, MyObject:.getString()); NavigableMap<Date, MyObject> d

我希望有一个将列表映射到NavigableMap的方法。方法调用需要一个用作映射键的参数。此参数是列表对象的属性

这两个电话都可以:

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

NavigableMap<String, MyObject> stringKeyMap = asNavMap(list, MyObject:.getString());
NavigableMap<Date, MyObject>   dateKeyMap   = asNavMap(list, MyObject::getDate());
这里我卡住了(?是Pair对象的属性):

公共静态导航地图asNavMap(列表项,?){
NavigableMap navMap=新树映射();
对于(V项:项){
导航地图放置(???,项目);
}
返回导航地图;
}
请注意,我几乎没有编写通用方法或使用lambda函数/接口的经验

感谢您的帮助

编辑1


正如尼克·范德霍芬(Nick Vanderhofen)提到的,我没有澄清寻找通用解决方案的过程

您可以通过一个函数来实现这一点。您保留了所需的代码:

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

NavigableMap<String, MyObject> stringKeyMap = asNavMap(list, MyObject::getKey);
也可以创建一个静态方法来获得相同的结果:

public static String getKey(MyObject myObject){
    return myObject.getKey();
}
要应用该功能,只需使用
apply
方法:

String key = getKey.apply(someObject);
对于实际的映射实现,您可以保留For循环,也可以使用Java8重写它,并重新使用在收集器中作为参数获得的函数。但是,由于您需要树形图,因此语法非常冗长:

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

刚刚想出了一个有效的解决方案

仍在阅读,我尝试使用
函数
,现在这是我的解决方案:

public static <K, V> NavigableMap<K, V> asNavigableMap(List<V> items, Function<V, K> mapper) {
  NavigableMap<K, V> navMap = new TreeMap<>();
  for (V item : items)
    navMap.put(mapper.apply(item), item);
  return navMap;
}
publicstaticnavigablemap作为NavigableMap(列表项,函数映射器){
NavigableMap navMap=新树映射();
对于(V项:项)
导航地图。放置(地图绘制者。应用(项目),项目);
返回导航地图;
}
这些电话有效:

List<Pair<Integer, String>> pairs = new ArrayList<>();
pairs.add(new Pair<Integer, String>(1, "one"));

NavigableMap<Integer, Pair<Integer, String>> navI2P1 = GenericConverter.asNavigableMap(pairs, Pair::getKey);
NavigableMap<String, Pair<Integer, String>> navI2P2 = GenericConverter.asNavigableMap(pairs, Pair::getVal);
List pairs=new ArrayList();
添加(新的一对(1,“一”);
NavigableMap navI2P1=GenericConverter.asNavigableMap(pairs,Pair::getKey);
NavigableMap navI2P2=GenericConverter.asNavigableMap(pairs,Pair::getVal);
我很难理解
功能
功能接口和应用方法


感谢所有人

去掉括号。你的意思是
MyObject::getDate
?如何定义方法签名和密钥分配?能否指定两个
MyObject
是否可以具有相同的日期或字符串?如果是,如何处理重复密钥冲突?留一个?合并?他们不能。如果他们这样做,那就是我的数据模型中的一个错误我有几个包含自定义数据类型的列表,我不想为每个类型创建转换器方法,我想使用NavigalbeMap的floor方法。这就是为什么我在寻找一个通用方法,为什么我需要几种不同的键类型。祝贺你!由于您的解决方案与我的答案完全一致,我希望您能接受:)Ups,你好,尼克,平行回答:D谢谢你的解决方案!但它仍然是一个具体的实现,我希望有一个通用的方法。其中一个问题是映射(您的注释
//映射在这里
)。但无论如何,非常感谢你,这是非常接近想要的解决方案!我忽略了这一点,因为你已经有了那段代码,你也可以用Java 8稍微重写for循环,等等,我会告诉你,我会等等,对任何解决方案都感兴趣。实际上,我试图解释如何将函数传递给方法,因为你的问题是如何传递第二个参数。我添加了一个如何使用收集器创建树映射的示例。事实上,我认为它相当冗长,所以在这种情况下,传统的for-each循环可能更好。正确的,我没有充分强调泛型方法,但我认为我的结巴示例确实如此。很抱歉现在仍在尝试流示例以使其正常工作。。。
String key = getKey.apply(someObject);
items.stream().collect(Collectors.toMap(mapper, Function.identity(), (a,b) -> a, TreeMap::new));
public static <K, V> NavigableMap<K, V> asNavigableMap(List<V> items, Function<V, K> mapper) {
  NavigableMap<K, V> navMap = new TreeMap<>();
  for (V item : items)
    navMap.put(mapper.apply(item), item);
  return navMap;
}
List<Pair<Integer, String>> pairs = new ArrayList<>();
pairs.add(new Pair<Integer, String>(1, "one"));

NavigableMap<Integer, Pair<Integer, String>> navI2P1 = GenericConverter.asNavigableMap(pairs, Pair::getKey);
NavigableMap<String, Pair<Integer, String>> navI2P2 = GenericConverter.asNavigableMap(pairs, Pair::getVal);