【问题标题】:How can you test for a boolean value inside a Map?如何测试 Map 中的布尔值?
【发布时间】:2011-12-12 04:13:00
【问题描述】:

我是java新手,所以请放轻松。我有一个哈希图,其中包含字符串键和布尔值,如下所示。

Map<String, Boolean> states = new HashMap<String, Boolean>();
states.put("b_StorageAvailable", true);
states.put("b_StorageWritable", true);

我从一个函数返回。一旦我在其他地方得到这个,我希望能够在其中一个上调用 if 语句,看看它是真是假。

if(states.get("b_StorageAvailable")) { 
    //Do this 
}

但是 java 一直告诉我我需要它是一个布尔类型,它是一个 Map 类型。我怎样才能轻松做到这一点?

更新

需要注意的是,我调用函数并获取返回值的代码是这样的,

Map states = this.getExternalStorageStatus();

【问题讨论】:

  • 你考虑过使用 Set 吗?
  • 在 Eclipse 上使用 Jdk 1.6 对我来说效果很好
  • 除了您的} 在评论中之外,我的编译器/IDE 对您的代码没有任何问题
  • 我刚看到你的更新:MapMap&lt;String, Boolean&gt; 完全不同
  • @adrian 大声笑这实际上不是我的代码的样子......我只是把它放在这里用于描述目的。我现在只为你修好了:p

标签: java


【解决方案1】:

假设您使用的是 Java 5 或更高版本(鉴于已演示的泛型使用情况,您必须这样做):

if(Boolean.TRUE.equals(states.get("b_StorageAvailable"))){
   //Do this
}

【讨论】:

  • 我试着把它放进去,但 netbeans 把它显示为一个错误。但是我还没有尝试运行它:p
  • 如果它不起作用,请包括它所显示的错误的描述。
  • 您的错误可能是由于大括号不匹配 - 尝试执行if(states.get("b_StorageAvailable") == true) { /* Do this */ }
  • mprabhat 的回答,虽然目前在语法上不正确,但提出了另一个好处 - 您还需要检查空值,因为没有存储任何值。
  • 我的原始答案在 Eclipse 下使用 Java 1.6 成功编译和执行。但是,我还对其进行了更新以考虑空值,并且测试也成功。
【解决方案2】:

您的代码看起来不错。只要确保您使用的是完全相同的密钥 ("b_StorageAvailable")。因为Map 中的Boolean 被自动装箱为原始布尔值,如果Map 中没有提供的键的条目,您将获得NullPointerException

我还会检查您的函数的返回类型和局部变量是否也定义为HashMap&lt;String, Boolean&gt;。如果它是无类型的,那么您将无法假设它是Map 中的Boolean

public static void main(String[] args) {

    Map<String, Boolean> states = new HashMap<String, Boolean>();
    states.put("b_StorageAvailable", true);
    states.put("b_StorageWritable", true);

    if(states.get("b_StorageAvailable")){ // works fine!
        System.out.println("storage is available!");
    }

    Map states2 = new HashMap<String, Boolean>(); // untyped!
    states.put("b_StorageAvailable", true);
    states.put("b_StorageWritable", true);
    if(states2.get("b_StorageAvailable")){ // Type mismatch: cannot convert from Object to boolean
        System.out.println("storage is available!");
    }

}

所以你需要做的就是改变

Map states = this.getExternalStorageStatus(); 

Map<String, Boolean> states = this.getExternalStorageStatus();

并且可能会改变getExternalStorageStatus()的返回类型

private Map<String,Boolean> getExternalStorageStatus(){
 ...
}

【讨论】:

  • 返回类型为 Map。应该是HashMap吗?您可以在那里看到,我的状态是 Map 类型。
  • 将返回类型改为HashMap,states类型改为HashMap并不能修复错误。
  • 请注意,仍有可能无法取回值,这可能会导致 NullPointerException。这需要检查。请参阅我的回答,以了解如何妥善处理此问题。
  • 好的,知道了!我将返回类型更改为 Map,并将检索变量更改为 Map states = getExternalStorageStatus() 并且它起作用了。
【解决方案3】:

当你这样做时

if(states.get("b_StorageAvailable")) 

您正试图获取存储在密钥 b_StorageAvailable 上的值

把它改成这样:

if(states.get("b_StorageAvailable")) != null {
   //Do your task check if the boolean is false or not
}

会让你走上最简单的路

if(states.get("b_StorageAvailable") != null && states.get("b_StorageAvailable").booleanValue()) {
   //Do your task 
}

如果你想检查你的地图是否包含一个特定的键,你可以检查map.containsKey API

【讨论】:

  • 警告:if(states.get("b_StorageAvailable")) != null) 将评估为 true,即使 Map 中的值是 false
  • @Asaph:他的观点是有效的预防措施。如果映射不适用于提供的密钥怎么办?它最终会导致NullPointerException,同时使用.booleanValue()(自动)取消装箱布尔值。
【解决方案4】:

你的语法很好,我在下面写了测试代码,它通过了。您可能还想确保正确拼写键值,并使用 containsKey 进行测试以确保键有效。我写了下面的测试代码,它通过了。

(作为一个额外的建议,您可能还想将您的 States Map 重构为适当的类,就像我在下面所做的那样。我尽可能避免绕过 Maps。)

import static org.junit.Assert.assertTrue;

import java.util.HashMap;
import java.util.Map;

import org.junit.Test;

public class StatesTest {

    @Test
    public void testStates() {
        Map<String, Boolean> statesMap = new HashMap<String, Boolean>();
        statesMap.put("b_StorageAvailable", true);
        statesMap.put("b_StorageWriteable", false);

        States states = new States(statesMap);

        assertTrue(states.isStorageAvailable());
        assertTrue(states.isStorageWriteable() == false);
    }
}

class States {
    private boolean storageAvailable;
    private boolean storageWriteable;
    // etc

    public States(Map<String, Boolean> states) {        
        if (states.containsKey("b_StorageAvailable")) {
            storageAvailable = states.get("b_StorageAvailable");
        }

        if (states.containsKey("b_StorageWriteable")) {
            storageWriteable = states.get("b_StorageWriteable");
        }
    }

    public boolean isStorageAvailable() {
        return storageAvailable;
    }

    public boolean isStorageWriteable() {
        return storageWriteable;
    }
}

【讨论】:

    猜你喜欢
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多