Java中为何无法将.orElseThrow配合构造方法引用::new使用?
Lambda转方法引用的问题分析
直接把
() -> new ClubException(ClubErrorCode.INVALID_CLUB_ID)改成ClubException(ClubErrorCode.INVALID_CLUB_ID)::new完全不可行,甚至连语法都不合法,根本过不了编译。原因在于
orElseThrow方法要求传入的是Supplier<? extends RuntimeException>类型的参数,这个接口的核心是无参的get()方法——不需要输入任何参数,直接返回一个异常实例:- 你的原Lambda表达式
() -> new ClubException(ClubErrorCode.INVALID_CLUB_ID)完全符合要求:没有参数,执行后返回一个预先指定错误码的ClubException实例。 - 而
ClubException(ClubErrorCode.INVALID_CLUB_ID)::new是错误语法,Java不允许在方法引用中直接传入具体参数值。方法引用只能引用构造方法或普通方法的"模板",不能硬编码参数。
- 你的原Lambda表达式
若想用方法引用实现相同逻辑,需要额外封装,但反而不如原Lambda简洁:
比如先写一个静态方法返回对应的Supplier:private static Supplier<ClubException> invalidClubIdExceptionSupplier() { return () -> new ClubException(ClubErrorCode.INVALID_CLUB_ID); }然后调用时用方法引用:
Club club = clubRepository.findById(clubId).orElseThrow(YourCurrentClass::invalidClubIdExceptionSupplier);但这种写法完全没必要,原Lambda已经足够清晰简洁。
结论:同事的建议是错误的,你的原代码写法没问题,这种需要固定参数构造异常的场景,直接用Lambda是最合理的选择。
内容的提问来源于stack exchange,提问作者GyeongEun Kim
相关产品推荐
相关产品推荐

