,java"/>

首页 > 解决方案 > 如何获取地图中特定字段的值

问题描述

我有类似的东西:

Map<String, Object> hashMap;

当我做类似的事情时:

hashMap.get("binary"), I get value as: {size=5642, name=abc}

key是二进制,value是 Object 类型的 Object,是 {size=5642, name=abc}

请注意,这些值不属于特定类。在 Python 中,我可以做类似的事情hashMap["binary"]["size"],想知道 java 中的等价物是什么

如何在size不解析上述字符串的情况下直接获取 的值?

标签: java

解决方案


该值不是 Object 类型,而是从 Object 扩展的某种类型(在 java 中,所有内容都隐式扩展 Object)。让我们称之为“X”

现在,它不像 python 那样工作,因为与 python 不同,java 没有那种动态特性。

{size=5642, name=abc}可能是该类型 X 的字符串表示形式。这是您在调试器中看到的,或者可能是在尝试使用控制台打印值时看到的System.out.println

现在首先弄清楚它是哪种类型:

Object value = hashMap.get("binary")
System.out.println(value.getClass().getName());

它将打印类名

然后查看那个类的源码,大概是这样的:

public class X {
   private final int size;
   private final String name;

   ... // constructor, other stuff maybe


   // these are called "getters" in java world
   public int getSize() {return size;}
   public String getName() {return name;}
}

从那时起,您有两种获取大小的方法:

Object value = hashMap.get("binary");
int size = ((X)value).getSize();  // This is called downcasting

这种方法的缺点是你没有利用泛型的力量

因此,如果可能的话,更好的选择当然是重构:

Map<String, X> hashMap = ...
X value = hashMap.get("binary");
value.getSize();

最后一点:

如果碰巧该值是字符串类型,则除了使用正则表达式或其他方式解析值之外,您将无法获得大小。在这种情况下,将重构视为更好的选择。


推荐阅读