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

当可选项为空时如何返回?

南宫书
2023-03-14

我喜欢现在Java标准库中的选项。但有一个基本问题我一直碰到,但我还没想好如何用最好的(最容易读懂、最漂亮、最短的)方法解决:

当选项为空时如何从方法返回?

void m1() {
    // When I get an optional:
    Optional<String> o = getOptional();

    // And want to return if it's empty
    if (!o.isPresent()) return;

    // In the whole rest of the method I have to call Optional.get 
    // every time I want the value:
    System.out.println(o.get());

    // Which is pretty ugly and verbose!
}


void m2() {
    // If I instead return null if a value is absent:
    String s = getNullabe();
    if (s == null) return;

    // Then I can use the value directly:
    System.out.println(s);
}
void m3() {
    // If I on the other hand want to throw on empty that's pretty and compact:
    String s = getOptional()
        .orElseThrow(IllegalStateException::new);

    System.out.println(s);
}

void m4() {
    Optional<String> o = getOptional();
    if (!o.isPresent()) return;

    // I can of course declare a new variable for the un-optionalised string:
    String s = o.get();

    System.out.println(s);

    // But the old variable still remains in scope for the whole method 
    // which is ugly and annoying.
    System.out.println(o.get());
}


void m5() {
    // This is compact and maybe pretty in some ways:
    getOptional().ifPresent(s -> {
        System.out.println(s);

        // But the extra level of nesting is annoying and it feels 
        // wrong to write all the code in a big lambda.

        getOtherOptional().ifPresent(i -> {
            // Also, more optional values makes it really weird and 
            // pretty hard to read,  while with nullables I would 
            // get no extra nesting, it would looks good and be 
            // easy to read.
            System.out.println("i: " + i);

            // It doesn't work in all cases either way.
        });
    });
}


Optional<String> getOptional() {
    throw new UnsupportedOperationException();
}

Optional<Integer> getOtherOptional() {
    throw new UnsupportedOperationException();
}

String getNullabe() {
    throw new UnsupportedOperationException();
}

如果可选项为空,我如何从方法返回,而不必在方法的其余部分中使用get,也不必声明额外的变量和额外的块嵌套级别?

或者如果不可能得到所有这些,那么处理这种情况的最佳方法是什么?

共有1个答案

龚昊然
2023-03-14

您可以使用orelse(null):

String o = getOptional().orElse(null);
if (o == null) {
    return;
}
 类似资料:
  • 我试图在流量为空时返回404,类似于这里:WebFlux Functional:如何检测空流量并返回404? 我主要担心的是,当你检查通量是否有元素时,它会发出那个值,而你却松开了它。当我尝试使用switch时,如果服务器响应为空,它就永远不会被调用(我暗暗认为这是因为单声道不是空的,只有主体是空的)。 是否有一种方法可以恢复hasElements中发出的元素,或者让switchIfEmpty只检

  • 需要筛选一个项目列表并检查item.discount()<=0,以防没有找到返回可选对象类型。 这是一个为列表添加值的代码,但我不知道如果列表是空的,如何获得可选对象

  • 我有一个运行的Android应用程序,有一个导航抽屉活动。对于每个菜单项,我都希望实现一个单独的片段,这样我就可以使用相同的工具栏和抽屉菜单。现在,其中一个片段应该包含一个带有3个选项卡的视图(3个片段中有RecycerViews)。我创建了一个选项卡式活动,并将代码迁移到一个新的片段中。当我第一次点击带有tab-fragment的menuitem时,它工作得非常好。但当我浏览菜单,然后再次打开标

  • 我有一个方法,它接受一个内部有的对象: MatchData k可以是null,有时k.getWatchListDetail()也可以是null。 我需要检查两种情况。首先,如果它能抛出NPE。 上面的实现可以做到这一点,但我尝试使用或带有链接的流,所以我可以在一行链接中完成。

  • 我试图模拟一个对象,该对象返回一个带有Mockito的Java可选对象: 当被调用,它返回。 我希望方法返回 返回的任何原因? 方法如下: 以下是Junit:

  • 我正在使用Guava缓存热数据。当缓存中不存在数据时,我必须从数据库中获取数据: 我的问题是当数据不存在于数据库中时,我希望它返回并且不做任何缓存。但Guava保存与缓存中的关键字,并抛出一个异常,当我得到它: com.google.common.cache.CacheLoader$InvalidCacheLoadExcION: CacheLoader为shisoft键返回null。 我们如何避免