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:如何从包含为映射值的列表中获取值?的主要内容,如果未能解决你的问题,请参考以下文章
如何从对象数组中获取具有属性的列表,除非它包含具有特定值的另一个项目?