考虑以下HashMap
HashMap<String, String> map = new HashMap<String, String>();
我在地图中有值
map.put("model", "test");
目前,如果我想从我正在做的地图中获取价值
if(map!=null){
if(map.get("model")!=null && !map.get("model").isEmpty()){
//some logic
}
}
使用Optional
或Lambdas来实现上述条件,Java 8中是否有更好的方法?
答案 0 :(得分:12)
首先,您的地图不应为空。决不。它可能是空的,但没有理由它为空。这样就消除了第一次空检查。
现在,不幸的是,Java并没有这样的实用方法,但是几个常用的库(apache commons,Guava等)都有它,或者你可以自己编写它,所以它变成:
String model = map.get("model");
if (!Strings.isEmptyOrNull(model)) {
// do somthing
}
使用Optional将可空值包装为逻辑的一部分被视为反模式。可选项旨在用作返回类型。所以我不建议在这里使用它。
还要注意,感觉就像是在使用地图来存储对象的属性如果是这样,那么考虑使用类型属性来定义真实类,而不是使用地图。
答案 1 :(得分:6)
不确定为什么要检查地图是否为空,但这里是:
Optional.ofNullable(map)
.map(m -> m.getOrDefault("model", "")) // Use an empty String if not present
.filter(s -> !s.isEmpty()) // Filter all empty values
.ifPresent(valueString -> { // Check if value is present
// Logic here
});
或者在一行中:
Optional.ofNullable(map).map(m -> m.getOrDefault("model", "")).filter(s -> !s.isEmpty()).ifPresent(valueString -> {
// Logic here
});
如果您想要退货,请将ifPresent
更改为map
;即可选择你计算的任何东西。
答案 2 :(得分:2)
如果您对Optional
方法感兴趣,
您可以将map.get("model")
值换行到Optional.ofNullable
,并按Predicate<String>
value -> !value.isEmpty()
过滤工作:
if (isNull(map)) { // import static java.util.Objects.isNull;
return; // to minimise nesting
}
Optional.ofNullable(map.get("model"))
.filter(value -> !value.isEmpty())
.ifPresent(value -> { ... });
答案 3 :(得分:0)
如果您已在示例代码中声明map
,那么它将不会是null
,您无需检查它。如果你想确定然后添加一个断言:
assert map != null;
鉴于您正在测试空字符串,如果密钥不存在,可能的方法是使用空字符串作为默认值:
if (!map.getOrDefault("model", "").isEmpty()) {
...
}
我认为遗憾的是,如果密钥不存在,则Map
没有添加Optional
而不是null
的方法。类似的东西:
map.getOptional("model").filter(v -> !v.isEmpty()).ifPresent(v -> {
...
}
虽然已经添加了选项,但是旧的API几乎没有修改以弃用返回null
表示“不存在”的方法。
答案 4 :(得分:0)
您也可以尝试containsKey方法。例如:
HashMap<String, String> map = new HashMap<String, String>();
map.put("model", "test");
if(map!=null){
if(map.containsKey("model")){
//some logic
}
}