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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 8:如何从包含为映射值的列表中获取值?相关的知识,希望对你有一定的参考价值。

我有以下情况:我有一个LinkedHashMap <>,其中键类型是一个字符串,值类型各不相同: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();

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

谢谢。

答案

一旦你使用具有不同值(甚至键)类型的Map(更糟糕的是,嵌套地图)。然后我建议退后一步,试着分析你做了什么。看起来你使用class比使用Map更好。您的密钥的示例:

class YourClass 
    String a;
    String b;
    String c;
    YourOtherClass d;


class YourOtherClass 
    Integer d1;
    Integer d2;

为简单起见,我省略了getter,setter和constructors。

然后,您可以创建这些对象的实例,如下所示:

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

或者通过setter设置新值:

yoc.setD1(4); // works
yoc.setD1("4"); // doesn't work
另一答案

你的事情过于复杂了。你可以用非常简单的方式做到这一点。一个衬垫并不总是理想的解决方案。

我没有可能编译它,但它应该没问题。

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

以上是关于Java 8:如何从包含为映射值的列表中获取值?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Scala 中的映射键中获取值的常见元素?

Python - 从包含值列表的字典中添加具有映射值的新列

如何从对象数组中获取具有属性的列表,除非它包含具有特定值的另一个项目?

从日期时间表中获取包含开始值和结束值的列表

Cloud Firestore:如何在我的集合查询中获取文档引用并将其映射为 JSON 值?

如何创建多个从同一个数组中获取值的动态下拉列表,而无需更改 Javascript 中的其他下拉列表