技术解析

Java 语法糖的探讨: 如何简化没有 else 的 if 语句写法
0
2021-06-03 19:26:16
idczone

//java 中 对于有返回值的语句是必须要赋值给一个对象的。
//也就是说


//这个语句是编译不过的
1==1;

// 这样通过短路的方式去简化 if 语句是不行的
1==2&&method();

//所以对于没有返回值的 if 语句只能老实的写成
if(1==2)
  method();
  
//但是这样的话如果放到 lamda 表达式中就会让语句变得很复杂

//理想状态 1
list.foreach(val->1==2&&method(val));

//理想状态 2 这里的 void 表示没有任何操作,java 也不支持这种空操作
list.foreach(val->1==2?method(val));
list.foreach(val->1==2?method(val):void);

//现实
list大带宽服务器.foreach(val->{
if(1==2)
  method(val);
});


所以有什么更好的办法吗?


我觉得吧,你都用 Java 了就别想着玩花活了。这语言最大的工业优势就是你玩不出什么花活。能玩花火的,基本都被人说是重构火葬场了。

先转成 stream,filter 之后再 foreach

我觉得不在 foreach 里面用方法引用之类的就没必要用 foreach,正常写 for 循环就行了
要么就是 stream().filter(predicate).forEach(this::method)

.filter()
.forEach()

直接写有啥弊端吗?
语法糖不是为了优化才搞的嘛?

filter + forEach
不过就老老实实写个 for + if 也不难看啊(说不定效率还更高)……

好吧 看来 java 就别想那么多花样了 哈哈

你可以写个静态方法
public class Utils {
public static R ifTrueThenDo(boolean b, T params, Function callback) {
if (b) {
return callback.apply(params);
}
return null;
}
}
然后在别的类里引入:
import static xxx.Utils.ifTrueThenDo;
接下来你就可以一行语句完成你的这些功能了, 比如:
ifTrueThenDo(1==2, val, (val) -> method(val))

代码能高效的解决问题不就行了. 其他的都不重要. 代码最后是编程成产品给客户用, 客户才不管你用什么语法,语言.

用 Kotlin,你可以完全不用写 if 语句

不知道 Java 行不行,字典了解下

我比较震惊 1==1;居然编译不过去
虽然 java 的 stream 比较啰嗦晦涩,但是功能还是齐全的...
你觉得不全的话可以用 kotlin 库提供的扩展方法

我倒是希望 Java 能引入可选链,NullPointerException 太讨厌了

给他包装几层,包装的别人发现不了

Option 应该可以满足

Optional 写起来有点不爽,还是习惯 ?. 这样的语法糖 或者 ?? 也可以

这还要进一步简化吗?你省略了花括号,已经是离经叛道了好吗?

如果一个语句能清晰表达意思,就不用简化。你举例的各种方式,哪怕 java 支持,都没直接用 if 来写表达得清晰

我觉得明显是先 filter 再 foreach 更好,在 foreach 里先做个判断这种写法后续容易忘记导致出错什么的
先 filter 更符合正常思维

业务多规则判断可以写成责任链

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服