如何在Map中测试布尔值?

时间:2011-12-12 04:13:01

标签: java

我是java的新手,所以请放轻松我。我有一个hashmap,其中包含String键和布尔值,如下所示。

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();

4 个答案:

答案 0 :(得分:6)

假设您使用的是Java 5或更高版本(鉴于Generics的使用,您必须使用它):

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

答案 1 :(得分:5)

您的代码看起来很好。只需确保使用完全相同的密钥("b_StorageAvailable")。因为Boolean中的Map会自动装入原始布尔值,如果提供的密钥在Map中没有条目,则会得到NullPointerException

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

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(){
 ...
}

答案 2 :(得分:1)

当你这样做时

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

答案 3 :(得分:0)

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

(作为一个额外的建议,您可能还想将您的状态Map重构为正确的类,如下所示。我尽可能避免绕过地图。)

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;
    }
}