我是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();
答案 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;
}
}