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
不解析上述字符串的情况下直接获取 的值?
解决方案
该值不是 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();
最后一点:
如果碰巧该值是字符串类型,则除了使用正则表达式或其他方式解析值之外,您将无法获得大小。在这种情况下,将重构视为更好的选择。
推荐阅读
- python - Python 3.7 TypeError:缺少 1 个必需的位置参数:“输入”
- xamarin - 导航栏未在 Xamarin Forms 中显示页面标题
- spring-boot - 使用 Mockito 在 Spring Boot 中进行单元测试
- django - 在邮件中发送超链接将用户重定向到接受/拒绝页面后,如何在 django 中接受好友请求?
- ajax - 我需要数据,根据我发送的类型
- c - 如何使这更快?
- shell - 如何比较同一文件中的两列?
- angular - Angular 8 .NET Core 3.0.CORS 在某些请求中出现错误,但在其他请求中没有
- node.js - 如何将常量值与 api get 请求一起发送到节点服务器
- laravel - 将 Three.js 与 Laravel 一起使用 - 未定义要求