【问题标题】:Convert unknown Object to Boolean将未知对象转换为布尔值
【发布时间】:2017-07-28 09:35:54
【问题描述】:

我有一个Map <String,Object> 的数组映射。 Object 将是一个简单类型(StringIntegerBoolean、...)。

我正在尝试做类似的事情

Boolean isSet = (Boolean) metaMap.get("is_set");
if (isSet) ...

metaMap.get("is_set")可能没有设置,所以可以返回null;或者它已设置但它可能正在使用0/1 true/false"true"/"false"

如何将所有这些情况转换为布尔值?

我意识到有使用instanceofif/else 解决方案。我想知道是否有更简单的解决方案。

【问题讨论】:

  • 这听起来像是XY Problem。听起来您真的应该使用带有字段的专用类而不是Map
  • 如果它真的可以编码为0/1"true"/"false",那么我认为你唯一的方法就是编写一些显式代码parseBooleanFromObject 并在那里指定你真正的逻辑。或者可能是 4castle 是对的,而您正试图对更大的问题应用完全错误的(非 Java)解决方案。
  • 注释:“字符串、整数、布尔值”是不是基本类型
  • 评论 2:如果你这样做:Boolean isSet = (Boolean) metaMap.get("is_set");is_setnull(在 metaMapnull 中设置或不在 metaMap 中) - 你会得到NPE。

标签: java casting


【解决方案1】:

由于您提供的信息很少,我假设您可以完全控制代码 - 尤其是数组的创建。

不要在数组中使用Map<String, T>,而是创建并使用具有类似于以下方法的接口,并从中派生StringMetaMapIntegerMetaMap等类。

public interface MetaMap
{
 // returns true, if property is contained
 public boolean hasProperty(String property);

 // returns non-null value of property or throws an exception
 public boolean getPropertyOrThrow(String property) throws IllegalArgumentException;

 // returns null or property value (use methods above if you want to avoid null values)
 public Boolean getProperty(String property);
}

这些类封装了它们如何编码布尔值并允许通过接口轻松处理。

【讨论】:

  • 从 Java 8 开始,Map<K,V> 有一个 getOrDefault(key, default) 方法
【解决方案2】:

为什么不直接使用 map.entrySet().Stream.filter(e -> e != null).collect() 创建一个过滤掉空值的映射。

【讨论】:

  • 对象为假时不会为空
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 2016-08-02
  • 2016-04-27
  • 2012-02-25
相关资源
最近更新 更多