Java 8从HashMap中提取非null和非空值

时间:2017-11-08 22:55:15

标签: java dictionary java-8 optional

考虑以下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中是否有更好的方法?

5 个答案:

答案 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
 }
}