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

在Java上调用isPresent的最佳方法可选,java,sonarqube,optional,Java,Sonarqube,Optional,我有以下代码,sonar在访问值错误之前会对其抛出一个检查“Optional#isPresent()” private Map<String, Map<String, Object>> generateMap(Object object) { return Optional.ofNullable((List<Map<String, Object>>) object).map((obj) -> functionListToMap.app

我有以下代码,sonar在访问值错误之前会对其抛出一个检查“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();
}
私有映射生成器映射(对象){
返回可选的.ofNullable((List)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;
    }
}
私有映射生成器映射(对象){
可选结果=可选的可调用((列表)对象);
if(result.isPresent()){
返回result.map((obj)->functionListToMap.apply(obj)).get();
}
否则{
返回null;
}
}

有人能告诉我还有其他最好的方法吗?

未经检查的演员阵容是你应该尽量避免的。若您知道您的方法只能处理列表,那个么您的参数应该是这样键入的

我假设FunctionListMap是一个函数。这样调用它(functionListToMap.apply())几乎违背了函数接口的目的。相反,只需将其用作lambda

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

私有映射生成器映射(列表){
返回可选的.ofNullable(list).map(functionListToMap).orElse(null);
}
如果要在不存在数据的情况下返回空映射,请改用orElseGet():

私有映射生成器映射(列表){
返回可选的.ofNullable(list).map(functionListToMap).OrelGet(HashMap::new);
}
使用orElse(new HashMap())的区别在于,对于orElse,无论是否使用,每次都会实例化另一个对象,而对于OrelSet(),只有在需要时才调用供应商(HashMap::new)

您也可以重写该方法,而无需选择:

private Map<String, Map<String, Object>> generateMap(List<Map<String, Object>> list) {
    if (list == null) {
        return null;
    } else {
        return functionListToMap.apply(list);
    }
私有映射生成器映射(列表){
if(list==null){
返回null;
}否则{
返回函数listtomap.apply(列表);
}
}

或者,还要将FunctionListMap重写为一个方法:

private Map<String, Map<String, Object>> generateMap(List<Map<String, Object>> list) {
    if (list == null) {
        return null;
    } else {
        return functionListToMap(list);
    }
}
私有映射生成器映射(列表){
if(list==null){
返回null;
}否则{
返回函数listtomap(列表);
}
}

可能使用
orElse(Collections.emptyMap())
而不是get()?似乎您希望失败的强制转换为null。这是什么时候的事了?写这篇文章最好不要使用
Optional
private Map<String, Map<String, Object>> generateMap(List<Map<String, Object>> list) {
    if (list == null) {
        return null;
    } else {
        return functionListToMap.apply(list);
    }
private Map<String, Map<String, Object>> generateMap(List<Map<String, Object>> list) {
    if (list == null) {
        return null;
    } else {
        return functionListToMap(list);
    }
}