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

我返回可选值的方法不能以类似函数的方式使用

臧梓
2023-03-14

我正在编写一个方法,旨在递归地搜索嵌套集合中的值并返回包含该值的集合:

@SuppressWarnings("unchecked")
public static <E,
               R extends Collection<? extends E>> Optional<R> findRecursively(Collection<?> collection, E element)
                  throws ClassCastException {
   if (collection.isEmpty())
      return Optional.ofNullable(null);

   boolean nested = collection.stream()
                              .allMatch(e -> isSubclass(e.getClass(), Collection.class));
   for (Object c : collection) {
      R result;

      if (nested) {
         Optional<R> recursiveResult = findRecursively((Collection<?>) c, element);
         result = recursiveResult.orElse(null);
      } else {
         result = c.equals(element) ? (R) collection : null;
      }

      if (result != null)
         return Optional.of(result);
   }
   return Optional.ofNullable(null);
}

这很好,但当我使用该方法时,如果不先将返回的可选项赋给如下变量,我就无法直接处理它:

Collection<String> collection = null;
Set<String> set = Util.findRecursively(collection, "")
                      .orElseThrow(RuntimeException::new);

在这种情况下,编译器无法知道方法的返回类型。我不知道有什么好的可能使它生效。

我想出了另外两种方法,也不是很好:

>

public static <E,
               R extends Collection<E>> Optional<R> findRecursively(Collection<?> collection,
                                                                    E element,
                                                                    Class<R> returnType) {...

但我不喜欢这样,因为额外的参数(实际上)是不必要的,并且使方法不容易理解。

而不是可选,我只返回集合对象。但在这种情况下,我不能直接创建可选并像这样调用它:

Collection<String> collection = null;
Set<String> set = Optional.ofNullable(Util.findRecursively(collection, ""))
                          .orElseThrow(RuntimeException::new);

因为这里编译器又不知道返回类型,并且无法将类型参数推断为()方法的

有人知道这个问题的好办法吗?或者建议你怎么走?


共有1个答案

汪兴旺
2023-03-14

您可以在同一行中声明具体类型,而无需声明变量:

Util.<Collection, String, Set<String>>findRecursively(collection, "")...
 类似资料:
  • 本文向大家介绍Python函数返回不定数量的值方法,包括了Python函数返回不定数量的值方法的使用技巧和注意事项,需要的朋友参考一下 Python的函数是可以return多个值的,但其本质上还是返回单个值,只是利用了tuple的自动打包,将多个值打包成单个tuple返回。 使用代码验证: 运行结果,确认返回的是一个tuple, 稍微修改代码: 代码中利用了tuple的自动解包,将tuple的值分

  • 我正在等待(从USSD请求中)检索一个值,以便返回它(getUSSD):

  • 我相信这是一个愚蠢的问题,但我已经讨论了很久了。。我试图创建一个java程序,根据用户输入的年数和金额计算复利。但我一直遇到一个错误,void方法无法返回值。因此,我将方法切换为double,因为这是将返回的内容,但它告诉我double方法必须返回double。即使我在循环中返回一个双倍。。。请帮忙

  • 可选的用于表示可为空的对象,该类的一些用途包括 作为方法返回类型,作为返回null以 表示没有可用值的替代方法 区分“未知”(例如,不存在于映射中)和“已知无值”(存在于映射中,具有值 optional.缺席()) 将可为null的引用包装起来存储在不支持null的集合中(不过有几种其他方法应该首先考虑) 对于第一种情况,我是否需要在所有可为空的返回方法中返回可选的?

  • 问题内容: 重写的方法可以有不同的返回类型吗? 问题答案: Java支持*协变返回类型的重写方法。这意味着重写的方法可能具有更特定的返回类型。也就是说,只要新的返回类型可分配给你要覆盖的方法的返回类型,就可以使用。 例如: 这在Java语言规范的8.4.5节中指定: 如果返回类型是引用类型,则返回类型在彼此覆盖的方法之间可能会有所不同。返回类型可替换性的概念支持协变返回,即返回类型到子类型的特殊化

  • 我创建了spring boot 2.0演示应用程序,其中包含两个使用WebClient进行通信的应用程序。当我从WebClient的响应中使用Flux的block()方法时,它们经常停止通信。由于某些原因,我想使用列表而不是通量。 服务器端应用程序是这样的。它只返回Flux对象。 而客户端(或BFF端)应用程序是这样的。我从服务器获取Flux,并通过调用block()方法将其转换为List。 虽然