语句 lambda 可以替换为表达式 lambda

Posted

技术标签:

【中文标题】语句 lambda 可以替换为表达式 lambda【英文标题】:Statement lambda can be replaced with expression lambda 【发布时间】:2018-02-24 14:16:28 【问题描述】:

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

@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 正在为我的灰色 return 着色,但是当我删除 return 时,它向我突出显示没有 return

有人能解释一下它是如何工作的吗?

【问题讨论】:

【参考方案1】:

你的语句 lambda

param ->  return expression; 

可以改为表达式lambda

param -> expression

很简单,不是吗?注意,大括号和分号需要去掉。

【讨论】:

有效。谢谢。您认为哪个是 lambda 这个pastebin.com/imEtjwHp 或这个pastebin.com/gcaUMYQ4 的更好方法? 在这种情况下没有更好。随心所欲地做。但对我来说,这两个代码 sn-ps 都不可读。这应该始终是编码的首要标准。 @Seelenvirtuose 你介意给我们一个可读代码 sn-ps 的例子吗?【参考方案2】:

有时我发现离开 如果代码块足够长,大括号就在哪里(我认为它提高了可读性)

android Studio 中,您可以在方法开始时使用 //noinspection CodeBlock2Expr 在本地禁用警告,如下例所示

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于语句 lambda 可以替换为表达式 lambda的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin函数 ⑦ ( 内联函数 | Lambda 表达式弊端 | “ 内联 “ 机制避免内存开销 - 将使用 Lambda 表达式作为参数的函数定义为内联函数 | 内联函数本质 - 宏替换 )

lambda 表达式中的 C# 切换

Lambda 表达式

替换 lambda 表达式中的参数

Lambda表达式中的表达式lambda和语句lambda区别

如何在 LINQ 选择语句中使用 Lambda