语句lambda可以用表达式lambda

时间:2017-09-15 11:39:57

标签: java spring spring-mvc lambda optional

我使用Optional工具进行用户和邀请验证

@DeleteMapping("/friends/{username}")
public
HttpEntity<Boolean> removeFriend(
        @ApiParam(value = "The user's name", required = true) @PathVariable String username
) {
    Long fromId = authorizationService.getUserId();

    return userService.findByUsername(username)
            .map(user -> {
                 return friendshipService.findFriendship(fromId, user.getId())
                        .map(friendship -> {
                            friendshipService.removeFriendship(friendship);

                            friendship.setToId(friendship.getFromId());
                            friendship.setFromId(friendship.getToId());

                            friendshipService.removeFriendship(friendship);

                            return ResponseEntity.ok(true);
                        }).orElseGet(() -> ResponseEntity.notFound().build());
            }).orElseThrow(() -> new ResourceNotFoundException("User not found"));

然而,IntelliJ正在为我的灰色回归着色 https://zapodaj.net/2f48b1a26c392.png.html 但是当我删除返回时,它向我突出显示没有返回https://zapodaj.net/37605f08165c9.png.html

有人可以解释它是如何工作的以及它的全部内容吗?

3 个答案:

答案 0 :(得分:92)

您的语句lambda

param -> { return expression; }

可以更改为表达式lambda

param -> expression
简单,不是吗?请注意,需要删除大括号和分号。

答案 1 :(得分:1)

  

有时候我发现离开   如果代码块足够长,则将它们放在大括号内(我认为这可以提高可读性)

在Android Studio中,您可以像下面的示例一样,在方法开始时使用//noinspection CodeBlock2Expr在本地禁用警告

//noinspection CodeBlock2Expr
button.setOnClickListener((View v) -> {
        //a long single method call...
});

答案 2 :(得分:-1)

当我们在表达式 lambda 中使用花括号“Statement lambda can be replaced with expression lambda”和分号“{}”来实现函数式接口时,会出现 ; 消息。在这种情况下,我们可以取消那些人。话虽如此,我个人认为即使对于单行函数式接口实现使用块 lambda 也是一种很好的编码习惯,就像我们为单行 forwhile 循环所做的那样。