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

ppb*_*ppb 13 java dictionary optional java-8

让我们考虑一下 HashMap

HashMap<String, String> map = new HashMap<String, String>();
Run Code Online (Sandbox Code Playgroud)

我在地图中有值

map.put("model", "test");
Run Code Online (Sandbox Code Playgroud)

目前,如果我想从我正在做的地图中获取价值

if(map!=null){
 if(map.get("model")!=null && !map.get("model").isEmpty()){
   //some logic
 }
}
Run Code Online (Sandbox Code Playgroud)

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

JB *_*zet 12

首先,您的地图不应为空.决不.它可能是空的,但没有理由它为空.这样就消除了第一次空检查.

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

String model = map.get("model");
if (!Strings.isEmptyOrNull(model)) {
    // do somthing
}
Run Code Online (Sandbox Code Playgroud)

使用Optional将可空值包装为逻辑的一部分被视为反模式.可选项旨在用作返回类型.所以我不建议在这里使用它.

还要注意,感觉就像使用地图来存储对象的属性如果是这样,那么考虑使用类型属性来定义真实类,而不是使用地图.

  • @LordWilmore 我的观点是 ** 应该** 永远不会为空。拥有空 HashMap 将是一个设计错误。因此,如果您的设计是干净的,那么 HashMap 永远不应该为空,因此您不应该关心这一点:如果 HashMap 为空,则这是一个错误,并且抛出 NullPointerException 是正确的做法。 (2认同)

sma*_*c89 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
});
Run Code Online (Sandbox Code Playgroud)

或者在一行中:

Optional.ofNullable(map).map(m -> m.getOrDefault("model", "")).filter(s -> !s.isEmpty()).ifPresent(valueString -> {
        // Logic here
});
Run Code Online (Sandbox Code Playgroud)

更改ifPresentmap,如果你想返回的东西; 即可选择你计算的任何东西.