通过滥用包含在 if 语句中的三元来调用条件方法?

Conditional method calling by abusing ternary wrapped in if statement?

最近我在做代码审查,遇到了这个人:

if(!sharePermission.isExpired() ? activePermissions.add(sharePermission) : expiredPermissions.add(sharePermission));

基本上使用三元表达式调用方法,return一个布尔值并将其包装在if(...)语句中以满足作为独立语句的要求。这比

更有效还是更不有效
if(!sharePermission.isExpired())
   activePermissions.add(sharePermission); 
else 
   expiredPermissions.add(sharePermission); 

如果您真的需要将代码压缩到一行?当包裹在 if(...) 中时,是否为从三元表达式编辑的值 return 分配了任何类型的额外 space?

我不是他们两个的粉丝,只是好奇。

您正在寻找的 if..else 的三元等价物类似于 -

(!sharePermission.isExpired() ? activePermissions : expiredPermissions).add(sharePermission); // no if here

等同于

if(!sharePermission.isExpired()) {
    activePermissions.add(sharePermission); 
}
else {
    expiredPermissions.add(sharePermission);
}

没有分配发生,只有 boolean 条件的评估。没有为评估结果分配额外的内存。

然而,使用三元表达式来模拟三元语句,是非常不正统的。它会降低代码的可读性,而不会带来任何额外的好处。因此,使用 ifelse 是更好的选择。

注意,如果activePermissionsexpiredPermissions是同一类型,可以使用三元表达式来决定add调用的目标,如下:

(sharePermission.isExpired() ? expiredPermissions : activePermissions).add(sharePermission);

这样做是对 if 语句的滥用,更不用说条件表达式了。

编写完整的 if 语句或使用条件运算符 select 列表以添加到:

会更简洁
List<Permission> list = isExpired() ? expiredPermission : activePermission;
list.add(sharePermission);