在 Java 上调用 isPresent 的最佳方式可选

Best way to call isPresent on Java Optional

我有以下代码,声纳在访问值错误之前检查“Optional#isPresent()”。

private Map<String, Map<String, Object>> generateMap(Object object) {
    return Optional.ofNullable((List<Map<String, Object>>) object).map((obj) -> functionListToMap.apply(obj)).get();
}

我试过以下方法来修复错误,但我不确定这是否是最好的编码标准。

private Map<String, Map<String, Object>> generateMap(Object object) {
    Optional<List<Map<String, Object>>> result = Optional.ofNullable((List<Map<String, Object>>) object);
    if(result.isPresent()) {
        return result.map((obj) -> functionListToMap.apply(obj)).get();
    }
    else {
        return null;
    }
}

有人可以建议是否有其他最好的方法吗?

未经检查的转换是您应该尽量避免的事情。如果您知道您的方法只能处理 List>,那么您的参数应该这样输入。

我假设 functionListToMap 是一个 Function<>。像那样调用它 (functionListToMap.apply()) 几乎违背了功能接口的目的。相反,只需将其用作 lambda。

在这种情况下,如果没有数据,你只想 return null,你可以使用 orElse():

private Map<String, Map<String, Object>> generateMap(List<Map<String, Object>> list) {
    return Optional.ofNullable(list).map(functionListToMap).orElse(null);
}

如果您想要 return 一个空地图,如果没有数据,请改用 orElseGet():

private Map<String, Map<String, Object>> generateMap(List<Map<String, Object>> list) {
    return Optional.ofNullable(list).map(functionListToMap).orElseGet(HashMap::new);
}

与orElse(new HashMap<>())的区别在于orElse每次都会实例化另一个对象,不管是否使用,而orElseGet()是Supplier (HashMap::new) 仅在需要时调用。

您也可以不使用 Optional 重写该方法:

private Map<String, Map<String, Object>> generateMap(List<Map<String, Object>> list) {
    if (list == null) {
        return null;
    } else {
        return functionListToMap.apply(list);
    }

}

或者再次重写 functionListToMap 为方法:

private Map<String, Map<String, Object>> generateMap(List<Map<String, Object>> list) {
    if (list == null) {
        return null;
    } else {
        return functionListToMap(list);
    }
}