您好,这是我使用 Java 和 JPA 的代码。
\n Club club = clubRepository.findById(clubId).orElseThrow(\n () -> new ClubException(ClubErrorCode.INVALID_CLUB_ID)\n );\nRun Code Online (Sandbox Code Playgroud)\n我从同事那里得到了代码审查,我可以像这样重构代码。
\n() -> new ClubException(ClubErrorCode.INVALID_CLUB_ID)->ClubException(ClubErrorCode.INVALID_CLUB_ID)::new
但它不起作用。我不熟悉 lambda 和 Method\xc2\xa0Reference..
\n不可能这样重构吗?(使用::new)
\n你的同事错了。ClubException(ClubErrorCode.INVALID_CLUB_ID)::new不是有效的方法引用表达式。
方法引用表达式可以采用多种形式,但只有两种形式涉及::new. 请参阅语言规范中的语法。这两种形式是:
ClassType :: [TypeArguments] new
ArrayType :: new
Run Code Online (Sandbox Code Playgroud)
在这种情况下,前面的部分::new是ClubException(ClubErrorCode.INVALID_CLUB_ID)。这既不是 aClassType也不是ArrayType.
也就是说,这ClubException::new将是一个有效的方法引用表达式。如果有一个可访问的无参数构造函数,那么传递给ClubException也是有效的。当可选值为空时,将调用无参数构造函数来创建一个新实例。ClubException::neworElseThrowClubException
所以如果new ClubException()等于new ClubException(ClubErrorCode.INVALID_CLUB_ID),那么通过就ClubException::new可以达到你想要的效果。
否则,不能使用ClassType::new方法引用表达式的形式。
如果您确实想使用方法引用表达式,则可以声明一个返回new ClubException(ClubErrorCode.INVALID_CLUB_ID)某处的方法,并使用适当的方法引用表达式来引用该方法:
class SomeClass {
public static ClubException newClubException() {
return new ClubException(ClubErrorCode.INVALID_CLUB_ID);
}
}
//
...orElseThrow(SomeClass::newClubException);
Run Code Online (Sandbox Code Playgroud)