当前位置: 首页 > 知识库问答 >
问题:

可选的map函数返回null

姚昊焱
2023-03-14

有人能帮我处理下面的代码吗?我想要一个使用可选函数的等价物。

public String getMyRequiredValue(Optional<String> value) {
    if(value.isPresent()) {
        Optional<String> optionVal = getAnotherValue(value.get());
        if(optionVal.isPresent()) {
            return optionVal.get();
        } else {
            return null;
        }
    } else {
        return "Random";
    }
}

public Optional<String> getAnotherValue(String value) { ... }

只是一个音符我试过这个,但它不工作

return value.map(lang -> getAnotherValue(lang).orElse(null)).orElse("Random");

不起作用的是-当值存在并且返回可选值时。empty()我希望原始函数返回null。它现在正在返回“随机”。

我的假设是,由于map方法返回null,它被"Random"替换。

请注意,原始代码是由其他人编写的。由于它有很多依赖关系,我无法更改输入/输出参数。:(

共有1个答案

澹台昆
2023-03-14

最初由@Andreas在评论中提出的解决方案:

public String getMyRequiredValue(Optional<String> value) {
    return value.isPresent() ? getAnotherValue(value.get()).orElse(null) : "Random";
}

我首先想到的解决方案。它打破了在调用get()之前总是需要检查isPresent()的规则,并引入了异常处理。因此,最好坚持第一个想法。

public String getMyRequiredValue2(Optional<String> value) {
    try {
        return getAnotherValue(value.get()).orElse(null);
    } catch (NoSuchElementException e) {
        return "Random";
    }
}

我看到您试图使用地图和平面地图。如果它们导致可选。空(),不清楚null的来源:它可能是value或getAnotherValue(value.get())。

我们可以通过保存来自value的值来跟踪它。将()

public String getMyRequiredValue3(Optional<String> value) {
    final Holder<String> holder = new Holder<>();
    return value.flatMap(i -> getAnotherValue(holder.value = i))
                .orElse(holder.value == null ? "Random" : null);
}

同样,第一种方法仍然优于此。

编辑:正如@Holder所指出的,我们不需要上例中的Holder。相反,我们可以检查值。isPresent()

public String getMyRequiredValue4(Optional<String> value) {
    return value.flatMap(this::getAnotherValue) 
                .orElse(value.isPresent() ? null : "Random");
}
 类似资料:
  • 我使用类型TreeMap定义了一个集合 我想返回与包含给定字符串值的列表配对的字符串(TreeMap键)。例如,我有一个字符串“bob”存储在列表中的一对中,我想返回与“bob”所在的对列表相关联的Treemap的键(字符串)。我将如何执行此操作?

  • 是否有任何方法可以从NamedParameterJdbcTemplate返回可选的? 我的查询有时会返回空。所以我想要漂亮的方法来检查空。我不想做尝试捕捉空结果数据访问异常,因为这个有点丑。

  • 问题内容: 如何通过使用和避免返回值? 例: 问题答案: 要返回可选值的值,或者返回默认值(如果可选值没有值),则可以使用。 请注意,我重写了查找最长名称的代码:您可以直接与比较器比较每个String的长度。可以通过调用键提取器作为方法引用来获得一个这样的比较器。

  • 我在mybatis文档和inet中搜索过。但找不到解决方案。 我的目标是:从myBatis动态SQL选择返回阉羊 不创建pojo作为数据库表的表示。 它应该看起来像: 1) 动态SQL: 2) 我在动态选择中输入的参数: } 3) 返回映射的方法:

  • 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 我们来实现一个可变参数的求和。通常情况下,求和的函数是这样定义的: def calc_sum(*args): ax = 0 for n in args: ax = ax + n return ax 但是,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回

  • 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 我们来实现一个可变参数的求和。通常情况下,求和的函数是这样定义的: def calc_sum(*args): ax = 0 for n in args: ax = ax + n return ax 但是,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回