Java 如何在地图中测试布尔值?

Java 如何在地图中测试布尔值?,java,Java,我是java新手,所以请对我放松点。我有一个hashmap,它包含字符串键和布尔值,如下所示 Map<String, Boolean> states = new HashMap<String, Boolean>(); states.put("b_StorageAvailable", true); states.put("b_StorageWritable", true); 但是java不断告诉我,我需要它是一个布尔类型,它是一个映射类型。我怎样才能轻松做到这一点 更新

我是java新手,所以请对我放松点。我有一个hashmap,它包含字符串键和布尔值,如下所示

Map<String, Boolean> states = new HashMap<String, Boolean>();
states.put("b_StorageAvailable", true);
states.put("b_StorageWritable", true);
但是java不断告诉我,我需要它是一个布尔类型,它是一个映射类型。我怎样才能轻松做到这一点

更新

需要注意的是,我调用函数并获取返回值的代码如下所示

Map states = this.getExternalStorageStatus();

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

当你这么做的时候

if(states.get("b_StorageAvailable")) 
您正在提取存储在密钥
b\u 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

您的代码看起来很好。只需确保您使用的是完全相同的密钥(
“b_StorageAvailable”
)。由于
映射
中的
布尔值
自动装箱为基本布尔值,因此如果
映射
中没有提供键的条目,您将得到一个
NullPointerException

我还要检查函数的返回类型和局部变量是否也定义为
HashMap
。如果它是非类型化的,那么您将无法假定它是
映射中的
布尔值

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!");
    }

}


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

(作为一个额外的建议,您可能还希望像我下面所做的那样将状态映射重构为一个适当的类。我尽可能避免传递映射。)

import static org.junit.Assert.assertTrue;
导入java.util.HashMap;
导入java.util.Map;
导入org.junit.Test;
公共类国家测试{
@试验
公共无效测试状态(){
Map statesMap=newhashmap();
政治家风度(b_StorageAvailable,true);
statesMap.put(“b_StorageWriteable”,false);
州=新州(政治家);
assertTrue(states.isStorageAvailable());
assertTrue(states.isStorageWriteable()==false);
}
}
阶级国家{
私有布尔存储可用;
私有布尔存储可写;
//等
公共州(地图州){
如果(声明containsKey(“b_StorageAvailable”)){
storageAvailable=states.get(“b_storageAvailable”);
}
if(states.containsKey(“b_StorageWriteable”)){
storageWriteable=states.get(“b_storageWriteable”);
}
}
公共布尔IStorageAvailable(){
返回可用存储空间;
}
公共布尔值isStorageWriteable(){
返回存储可写;
}
}

我试着把它放进去,但netbeans显示它是一个错误。但是,我还没有尝试运行它:如果它不起作用,请包括它显示的错误的描述。您的错误可能是由于大括号不匹配-尝试执行
if(states.get(“b_StorageAvailable”)==true{/*执行此操作*/}
mprabhat的答案,尽管目前语法不正确,提出了另一个好的观点——您还需要检查空值,因为没有存储任何值。但是,我也更新了它以考虑空值,并且它也测试成功。您考虑过使用集合吗?它在eclipse上使用Jdk 1.6Apart很好,因为您的
}
在注释中,我的编译器/IDE对您的代码没有问题我刚刚看到了您的更新:
Map
Map
@adrian lol有很大的不同,这实际上不是我的代码的样子……我只是出于描述的目的把它放在这里。我现在只为您修复了它:警告:
if(states.get(“b_StorageAvailable”)!=空)
将计算为
true
,即使
映射中的值为
false
@asah:他的观点是有效的预防措施。如果映射不适用于提供的密钥,该怎么办?当使用
.booleanValue()
(自动)取消绑定布尔值时,它最终将导致
NullPointerException
。返回类型为Map。应该是HashMap吗?您可以在上面看到,“我的状态”是一种映射类型。将返回类型更改为HashMap,将状态类型更改为HashMap并不能修复此错误。请注意,仍然存在无法返回值的可能性,这可能会导致NullPointerException。这需要进行检查。请参考我的答案,用一句话来恰当地处理这个问题。好的,明白了!我将返回类型更改为Map,将检索变量更改为Map states=getExternalStorageStatus(),结果成功了。
if(states.get("b_StorageAvailable") != null && states.get("b_StorageAvailable").booleanValue()) {
   //Do your task 
}
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();
private Map<String,Boolean> getExternalStorageStatus(){
 ...
}
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;
    }
}