我有以下情况: 我有一个LinkedHashMap <>,其中键类型是String,值类型各不相同:double,String,LinkedHashMap等。 我正在尝试从LinkedHashMaps值之一的键中提取一个值,该值是主图的值。 例如,我想从以下代码中得到结果1(显然,因为它甚至没有编译,所以很混乱):
Map<String, Object> input = new HashMap<>();
input.put("a", "1234");
input.put("b", "2345");
input.put("c", "3456");
input.put("d", new HashMap<String, String>());
HashMap<String, Object> input2 = (HashMap<String, Object>)(input.get("d"));
input2.put("d1", 1);
input2.put("d2", 2);
Optional<Integer> result = input.entrySet().stream()
.filter(e -> e.getKey().equals("d"))
.map(Map.Entry::getValue)
.filter(e -> e.getKey().equals("d1"))
.findFirst();
我哪里出错了,当然,获得结果的最佳方法是什么?
谢谢。
答案 0 :(得分:5)
一旦您使用了具有不同值(甚至键)类型的Map
(更糟糕的是 nested 映射)。然后,我建议退后一步,尝试分析您所做的事情。看来class
比Map
更好。按键示例:
class YourClass {
String a;
String b;
String c;
YourOtherClass d;
}
class YourOtherClass {
Integer d1;
Integer d2;
}
为简单起见,我省略了getter,setter和构造函数。
然后您可以创建这些对象的实例,如下所示:
YourOtherClass yoc = new YourOtherClass(1, 2);
YourClass yc = new YourClass("1234", "2345", "3456", yoc);
然后调用特定的getter以接收具有类型安全性的值:
String a = yc.getA(); // works
Integer i = yc.getA(); // doesn't work
或通过设置器设置新值:
yoc.setD1(4); // works
yoc.setD1("4"); // doesn't work
答案 1 :(得分:2)
您正在使imo复杂化。您可以通过非常简单的方式来完成。一个衬板并不总是理想的解决方案。
我没有可能编译它,但是应该没问题。
public Optional<Integer> getInnerValue(Map<String, Object> map, String outerKey, String innerKey) {
Object o = map.get(outerKey);
if (!(o instanceof Map)) {
return Optional.empty();
}
return Optional.ofNullable(((Map)o).get(innerKey));
}
使用单线纸
public Optional<Integer> getInnerValue(Map<String, Object> map, String outerKey, String innerKey) {
return Optional.ofNullable(map.get(outerKey))
.filter(Map.class::isInstance)
.map(Map.class::cast)
.map(m -> m.get(innerKey))
.findFirst();
}