V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rizon
V2EX  ›  程序员

Java 语法糖的探讨: 如何简化没有 else 的 if 语句写法

  •  1
     
  •   rizon ·
    othorizon · 2021-04-09 14:35:36 +08:00 · 3378 次点击
    这是一个创建于 1308 天前的主题,其中的信息可能已经有所发展或是发生改变。
    
    //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);
    });
    
    
    

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

    20 条回复    2021-04-10 14:05:35 +08:00
    abersheeran
        1
    abersheeran  
       2021-04-09 14:39:12 +08:00   ❤️ 7
    我觉得吧,你都用 Java 了就别想着玩花活了。这语言最大的工业优势就是你玩不出什么花活。能玩花火的,基本都被人说是重构火葬场了。
    sylxjtu
        2
    sylxjtu  
       2021-04-09 14:40:36 +08:00   ❤️ 1
    先转成 stream,filter 之后再 foreach
    zydxn
        3
    zydxn  
       2021-04-09 14:43:36 +08:00   ❤️ 1
    我觉得不在 foreach 里面用方法引用之类的就没必要用 foreach,正常写 for 循环就行了
    要么就是 stream().filter(predicate).forEach(this::method)
    zhuweiyou
        4
    zhuweiyou  
       2021-04-09 14:44:51 +08:00   ❤️ 3
    .filter()
    .forEach()
    uselessVisitor
        5
    uselessVisitor  
       2021-04-09 14:45:11 +08:00   ❤️ 1
    直接写有啥弊端吗?
    语法糖不是为了优化才搞的嘛?
    chendy
        6
    chendy  
       2021-04-09 14:54:33 +08:00
    filter + forEach
    不过就老老实实写个 for + if 也不难看啊(说不定效率还更高)……
    rizon
        7
    rizon  
    OP
       2021-04-09 14:56:49 +08:00
    好吧 看来 java 就别想那么多花样了 哈哈
    bthulu
        8
    bthulu  
       2021-04-09 15:04:58 +08:00
    你可以写个静态方法
    public class Utils {
    public static <T, R> R ifTrueThenDo(boolean b, T params, Function<T, R> callback) {
    if (b) {
    return callback.apply(params);
    }
    return null;
    }
    }

    然后在别的类里引入:
    import static xxx.Utils.ifTrueThenDo;

    接下来你就可以一行语句完成你的这些功能了, 比如:
    ifTrueThenDo(1==2, val, (val) -> method(val))
    jones2000
        9
    jones2000  
       2021-04-09 15:37:41 +08:00
    代码能高效的解决问题不就行了. 其他的都不重要. 代码最后是编程成产品给客户用, 客户才不管你用什么语法,语言.
    Kasumi20
        10
    Kasumi20  
       2021-04-09 15:47:27 +08:00
    用 Kotlin,你可以完全不用写 if 语句
    CrazyMonkeyV
        11
    CrazyMonkeyV  
       2021-04-09 16:22:55 +08:00
    不知道 Java 行不行,字典了解下
    yazinnnn
        12
    yazinnnn  
       2021-04-09 16:36:51 +08:00
    我比较震惊 1==1;居然编译不过去

    虽然 java 的 stream 比较啰嗦晦涩,但是功能还是齐全的...
    你觉得不全的话可以用 kotlin 库提供的扩展方法
    ychost
        13
    ychost  
       2021-04-09 17:31:55 +08:00
    我倒是希望 Java 能引入可选链,NullPointerException 太讨厌了
    CantSee
        14
    CantSee  
       2021-04-09 17:34:18 +08:00
    给他包装几层,包装的别人发现不了
    baozijun
        15
    baozijun  
       2021-04-09 17:43:56 +08:00
    @ychost #13 Option 应该可以满足
    ychost
        16
    ychost  
       2021-04-09 17:48:09 +08:00
    @baozijun Optional 写起来有点不爽,还是习惯 ?. 这样的语法糖 或者 ?? 也可以
    dallaslu
        17
    dallaslu  
       2021-04-09 18:40:28 +08:00
    这还要进一步简化吗?你省略了花括号,已经是离经叛道了好吗?
    morimi2026
        18
    morimi2026  
       2021-04-09 19:31:33 +08:00 via iPhone
    如果一个语句能清晰表达意思,就不用简化。你举例的各种方式,哪怕 java 支持,都没直接用 if 来写表达得清晰
    ScepterZ
        19
    ScepterZ  
       2021-04-09 19:37:16 +08:00
    我觉得明显是先 filter 再 foreach 更好,在 foreach 里先做个判断这种写法后续容易忘记导致出错什么的
    先 filter 更符合正常思维
    securityCoding
        20
    securityCoding  
       2021-04-10 14:05:35 +08:00 via Android
    业务多规则判断可以写成责任链
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1086 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:34 · PVG 06:34 · LAX 14:34 · JFK 17:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.