【问题标题】:Java 8 method references: provide a Supplier capable of supplying a parameterized resultJava 8 方法参考:提供能够提供参数化结果的供应商
【发布时间】:2014-05-19 23:23:32
【问题描述】:

我想使用

java.util.Optional.orElseThrow()

具有要求构造函数参数的异常类型。像这样的:

.orElseThrow(MyException::new(someArgument)) // obviously NOT working

有没有办法创建一个供应商来传递我的参数值?

【问题讨论】:

  • 你为什么不能orElseThrow(() -> new MyException(someArgument))
  • 拥有大量流和可选经验的专业 Java 程序员......我有时仍然会在这里结束。这就是我更喜欢 Kotlin 的原因。

标签: java java-8 java-stream


【解决方案1】:

当然。

.orElseThrow(() -> new MyException(someArgument))

【讨论】:

    【解决方案2】:

    看来您只能从方法orElseThrow 中抛出RuntimeException。否则你会收到类似MyException cannot be converted to java.lang.RuntimeException的错误信息

    更新:- 这是旧版本 JDK 的问题。我在最新版本中没有看到这个问题。

    【讨论】:

    • 谢谢,当我在 groovy 中使用 Optional 时,这让我很失望。尝试从 groovy 闭包中尝试 throw Exception,但由于 java.lang.reflect.UndeclaredThrowableException 而失败,改为 RuntimeException 修复了它。
    • 很高兴知道这一点。幸运的是,我使用的是 RuntimeExceptions,但情况可能并非总是如此。
    • 不正确 根据Optional.orElseThrow 的类文档,您可以抛出Throwable,这意味着Error 或任何Exception
    • 我认为这是旧版本 JDK 8 的问题。
    • @Manu 也许你指的是在这个问题上讨论的JDK-8047338Throw RuntimeException inside Stream with Optional.orElseThrow。如果是这样,请包含在您的答案中。我没有足够的咖啡来判断这是否正确,因此我将避免自己编辑您的答案。
    【解决方案3】:
    optionalUsers.orElseThrow(() -> new UsernameNotFoundException("Username not found"));
    

    【讨论】:

    • 我收到错误“ Optional 类型中的方法 orElseThrow(Supplier extends X>) 不适用于参数 (() -> {})”
    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 2017-10-29
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多