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

2022-09-03 05:28:43

让我们考虑以下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
 }
}

在 Java 8 中,有没有更好的方法通过使用 或 Lambda 来实现上述条件?Optional


答案 1

首先,您的地图不应为空。从不。它可以是空的,但没有理由让它为空。因此,这消除了第一个空检查。

现在,不幸的是,Java没有这样的实用程序方法,但是几个常用的libs(apache commons,Guava等)都有它,或者你可以自己编写它,所以它变成了:

String model = map.get("model");
if (!Strings.isEmptyOrNull(model)) {
    // do somthing
}

使用 Optional 将可为 null 的值包装为逻辑的一部分被视为反模式。Optional 设计为用作返回类型。所以我不会在这里使用它。

另请注意,感觉就像是在使用映射来存储对象的属性 如果是这样,请考虑使用类型化属性定义一个实数类,而不是使用映射。


答案 2

不知道为什么在创建地图后检查地图是否为空,但这里是:

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

更改为“如果要返回某些内容”;即,您可以选择您计算的任何内容。ifPresentmap