我想要一个将 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/