Java 8:如何从包含为映射值的列表中获取值?

时间:2019-04-02 12:10:22

标签: java java-8

我有以下情况: 我有一个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();

我哪里出错了,当然,获得结果的最佳方法是什么?

谢谢。

2 个答案:

答案 0 :(得分:5)

一旦您使用了具有不同值(甚至键)类型的Map(更糟糕的是 nested 映射)。然后,我建议退后一步,尝试分析您所做的事情。看来classMap更好。按键示例:

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();
}