相关疑难解决方法(0)

从一个可选或另一个获得价值

我有两个java.util.Optional实例,我想得到一个Optional:

  • 如果它有值,则具有第一个Optional的值.
  • 如果它有值,则具有第二个Optional的值.
  • 是空的既不是Optional也有值.

是否有直接的方法来做到这一点,即是否已经有一些API来做到这一点?

以下表达式会这样做,但我必须提到第一个可选的两次:

firstOptional.isPresent() ? firstOptional : secondOptional
Run Code Online (Sandbox Code Playgroud)

这正是com.google.common.base.Optional.or()如此,但Java 8的API中不存在该方法.


aioobe接受的答案列出了一些替代方法来克服这种遗漏OptionalAPI的权利,在这种情况下必须计算这样的值(这回答了我的问题).我现在选择在我的代码库中添加一个实用程序函数:

public static <T> Optional<T> or(Optional<T> a, Optional<T> b) {
    if (a.isPresent())
        return a;
    else
        return b;
}
Run Code Online (Sandbox Code Playgroud)

java optional java-8

48
推荐指数
3
解决办法
2万
查看次数

Java 8的orElse没有按预期工作

考虑以下方法,如果字段存在,则返回字段,或者在找到字段之前递归调用自身:

private Field getField(Class<?> clazz, String p) {
    Optional<Field> field = Arrays.stream(clazz.getDeclaredFields())
            .filter(f -> p.equals(f.getName()))
            .findFirst();

    return field.isPresent() ? field.get() : getField(clazz.getSuperclass(), p);
}
Run Code Online (Sandbox Code Playgroud)

虽然这有效,但我认为我可以缩短它:

private Field getField(Class<?> clazz, String p) {
    return Arrays.stream(clazz.getDeclaredFields())
            .filter(f -> p.equals(f.getName()))
            .findFirst()
            .orElse(getField(clazz.getSuperclass(), p));
}
Run Code Online (Sandbox Code Playgroud)

但奇怪的是,这.orElse部分似乎总是被称为.

我在这里错过了什么?

java optional java-8

14
推荐指数
1
解决办法
1401
查看次数

Java 8可选orElse orElseThrow不一致

如果a是Optional [123],b是Optional [empty].

a.orElse(b.orElseThrow(() -> new UnexpectedInternalException(
                    "Error")))
Run Code Online (Sandbox Code Playgroud)

它为什么扔?

java optional java-8

2
推荐指数
2
解决办法
882
查看次数

标签 统计

java ×3

java-8 ×3

optional ×3