【问题标题】:No instance(s) of type variable(s) U exist so that void conforms to U不存在类型变量 U 的实例,因此 void 符合 U
【发布时间】:2022-01-24 11:41:52
【问题描述】:

我试图避免 isPresent 检查下面的代码,但编译器会发出错误消息

“不存在类型变量U 的实例,因此void 符合U

致电printAndThrowException。这是我的代码:

values.stream()
    .filter(value -> getDetails(value).getName.equals("TestVal"))
    .findFirst()
    .map(value -> printAndThrowException(value))
    .orElseThrow(new Exception2("xyz"));

有问题的方法 printAndThrowException 具有以下签名:

void printAndThrowException(Pojo value)

上述方法总是抛出RuntimeException 类型的异常。上述代码不是确切的代码,只是将我的代码转换为代表情况。

这里有什么问题以及在调用printAndThrowException时如何避免使用isPresent

【问题讨论】:

  • 您必须提供更多关于变量类型 (values) 以及流管道中的每个步骤返回什么以及在哪个步骤中出现此错误的详细信息
  • orElseThrow 应该带一个供应商。所以,它将是.orElseThrow(() -> new Exception2(..))
  • @user7 :添加了更多详细信息。此外,orElseThrow 没有显示任何错误,错误在于调用 printAndThrowException。
  • map() 用于将一个值convert 转换为另一个值——这里不是这种情况——这个用例似乎更像ifPresentOrElse() 的情况(Java 9 或更高版本)
  • @MCEmperor 我意识到在 ifPresent 中调用该方法并在调用位置本身抛出异常会更干净:)

标签: java functional-programming java-stream optional


【解决方案1】:

Optional.map() 需要 Function<? super T, ? extends U> 作为参数。由于你的方法返回void,所以不能在lambda中这样使用。

我在这里看到三个选项:

  • 让该方法返回 Void/Object/whatever - 语义上并不理想,但它会工作
  • 使该方法返回异常,并将 lambda 定义更改为
    .map(v -> {
        throw printAndReturnException();
    });
    
  • 使用ifPresent(),并将orElseThrow()移出调用链:
    values.stream()
        .filter(value -> getDetails(value).getName.equals("TestVal"))
        .findFirst()
        .ifPresent(value -> printAndThrowException(value))
    throw new Exception2("xyz");
    

【讨论】:

    猜你喜欢
    • 2022-09-23
    • 2020-07-13
    • 2019-12-16
    • 2022-10-18
    • 2017-12-04
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    相关资源
    最近更新 更多