为什么我不能在 Java 中将 .orElseThrow 与 ::new 一起使用

Gye*_*Kim 1 java lambda

您好,这是我使用 Java 和 JPA 的代码。

\n
  Club club = clubRepository.findById(clubId).orElseThrow(\n                () -> new ClubException(ClubErrorCode.INVALID_CLUB_ID)\n        );\n
Run Code Online (Sandbox Code Playgroud)\n

我从同事那里得到了代码审查,我可以像这样重构代码。

\n

() -> new ClubException(ClubErrorCode.INVALID_CLUB_ID)->ClubException(ClubErrorCode.INVALID_CLUB_ID)::new

\n

但它不起作用。我不熟悉 lambda 和 Method\xc2\xa0Reference..

\n

不可能这样重构吗?(使用::new)

\n

Swe*_*per 5

你的同事错了。ClubException(ClubErrorCode.INVALID_CLUB_ID)::new不是有效的方法引用表达式。

方法引用表达式可以采用多种形式,但只有两种形式涉及::new. 请参阅语言规范中的语法。这两种形式是:

ClassType :: [TypeArguments] new 
ArrayType :: new
Run Code Online (Sandbox Code Playgroud)

在这种情况下,前面的部分::newClubException(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)