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