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

Java ,多个变量都只允许是 0 或 1,怎么写简单

  •  1
     
  •   nutting · 2020-12-30 11:44:19 +08:00 · 6305 次点击
    这是一个创建于 1422 天前的主题,其中的信息可能已经有所发展或是发生改变。
    if (!(open.equals("0") || open.equals("1")) && (w1.equals("0") || w1.equals("1"))
    && (w2.equals("0") || w2.equals("1")) && (w3.equals("0") || w3.equals("1"))
    && (w4.equals("0") || w4.equals("1")) && (w5.equals("0") || w5.equals("1"))
    && (w6.equals("0") || w6.equals("1")) && (w7.equals("0") || w7.equals("1"))) {
    throw new Exception("设置项目参数非法!");
    }

    checkstyle 检测说表达式过于复杂,怎么简化,最好别用 java8 以上的什么新语法
    52 条回复    2021-01-04 15:19:36 +08:00
    haoz1w0w
        1
    haoz1w0w  
       2020-12-30 11:48:04 +08:00
    >1 不就行了
    boris93
        2
    boris93  
       2020-12-30 11:48:22 +08:00 via Android
    就不能用 bool ?
    jimliang
        3
    jimliang  
       2020-12-30 11:50:01 +08:00
    人才
    flyfanc
        4
    flyfanc  
       2020-12-30 11:50:07 +08:00
    Arrays.asList("1", "0").containsAll(Arrays.asList(w1,w2,w3,…));
    jintianfengda
        5
    jintianfengda  
       2020-12-30 11:55:24 +08:00   ❤️ 1
    抽出来方法封装呗
    public boolean checkAll(String... args){}
    代码洁癖患者提醒,最好使用"1".equals(open)哦,01 用枚举替代
    nutting
        6
    nutting  
    OP
       2020-12-30 11:57:16 +08:00
    @haoz1w0w 没写清楚,是字符的 0 或者 1

    @boris93 呃,历史原因,不过也对啊,看看能不能改


    @jintianfengda 抽不抽好说,关键是判断的写法


    @flyfanc 你这个写法我研究一下
    Gilgamesh7
        7
    Gilgamesh7  
       2020-12-30 12:05:07 +08:00
    假设接收参数的是 body,使用 validation 注解校验参数,然后字段注解使用 @Pattern,写个正则判断一下是字符串 0 或 1
    yuk1no
        8
    yuk1no  
       2020-12-30 12:05:22 +08:00 via iPhone
    Stream.of(x, y, z).allMatch(s -> s.equals("0") || s.equals("1"));
    chendy
        9
    chendy  
       2020-12-30 12:16:21 +08:00   ❤️ 1
    1 抽单个的判断方法 boolean isValid(String x) { return "0".equals(x) || "1".equals(x); }
    2 抽一堆的判断方法 boolean isValid(String... xs) { for(String x in xs) { if (!isValid(x)) {return false} } return true;}
    Mohanson
        10
    Mohanson  
       2020-12-30 12:20:20 +08:00 via Android
    r = a∣ b ∣c ...
    r = r & 0

    if r != 0 , throw
    janus77
        11
    janus77  
       2020-12-30 12:20:23 +08:00 via iPhone
    你们花样真多……枚举他不香嘛
    Mohanson
        12
    Mohanson  
       2020-12-30 12:22:04 +08:00 via Android
    r = r & (0xffffffff - 1) 上面公式有误,fix
    lxychn
        13
    lxychn  
       2020-12-30 12:25:27 +08:00
    ```
    for (String arg : Arrays.asList(w1, w2, w3)) {
    if (!arg.equals("0") && !arg.equals("1")) {
    throw new Exception("Invalid arg: " + arg);
    }
    }
    ```
    zmxnv123
        14
    zmxnv123  
       2020-12-30 12:25:56 +08:00 via iPhone
    计数
    Cabana
        15
    Cabana  
       2020-12-30 12:26:04 +08:00
    用位运算 mask 掩码模式
    zhanglintc
        16
    zhanglintc  
       2020-12-30 12:57:00 +08:00
    用正则如何:

    import java.util.regex.*;
    String pattern = "[01]";
    if ( !(Pattern.matches(pattern, open) && Pattern.matches(pattern, w1)
    && Pattern.matches(pattern, w2) && Pattern.matches(pattern, w3)
    && Pattern.matches(pattern, w4) && Pattern.matches(pattern, w5)
    && Pattern.matches(pattern, w6) && Pattern.matches(pattern, w7)) ) {
    throw new Exception("设置项目参数非法!");
    }
    imjamespond
        17
    imjamespond  
       2020-12-30 13:04:41 +08:00 via Android   ❤️ 1
    拼起来用正则
    zhuawadao
        18
    zhuawadao  
       2020-12-30 13:13:08 +08:00
    把这几个变量直接拼成字符串,然后用正则看是否只有 0 或只有 1
    lonelinsky
        19
    lonelinsky  
       2020-12-30 13:14:41 +08:00 via Android   ❤️ 1
    new 一个 Set, 然后变量全 put 然后检查 Set 的 size 和 content
    yanhh
        20
    yanhh  
       2020-12-30 13:20:56 +08:00   ❤️ 1
    这种都是用二进制掩码来做,楼主应该没写过底层一点的东西,哈哈,可以看看最靠近的 WinAPI,里边有很多。
    zunceng
        21
    zunceng  
       2020-12-30 13:22:54 +08:00
    开个脑洞 设计个注解式的 validator?

    class A extern Validator {
    // value_of=1,2,3;
    int A;
    // min=0; max=10;
    int B;
    // value_of="0", "1"
    string C;
    }

    method:
    bool IsValid()
    string ErrorMessage()
    chendy
        22
    chendy  
       2020-12-30 13:23:07 +08:00
    说二进制的朋友们……没看到楼主的是字符串么
    LGA1150
        23
    LGA1150  
       2020-12-30 13:26:07 +08:00
    if (Stream.of(open, w1, w2).anyMatch(x -> !"0".equals(x) && !"1".equals(x))) throw ...
    marcong95
        24
    marcong95  
       2020-12-30 13:26:37 +08:00
    Pattern.matches("[01]{8}", open+w1+w2+w3+w4+w5+w6+w7)
    Flywith24
        25
    Flywith24  
       2020-12-30 13:32:45 +08:00   ❤️ 2
    hfc
        26
    hfc  
       2020-12-30 13:51:18 +08:00   ❤️ 6
    new 个 set,初始只有字符串的 0 和 1,后续把上面这一串变量往里面塞,最后 set.size()>2 就是存在非法参数
    phpfpm
        27
    phpfpm  
       2020-12-30 14:10:00 +08:00
    你拆成多个 if-elseif 多好
    这样 throw 的时候你还有在哪出问题的 context
    sutra
        28
    sutra  
       2020-12-30 14:17:05 +08:00
    Ranying
        29
    Ranying  
       2020-12-30 14:22:38 +08:00
    遍历这些变量拼接的字符串
    liyanggyang
        30
    liyanggyang  
       2020-12-30 14:26:24 +08:00
    @yuk1no 这个可
    lululau
        31
    lululau  
       2020-12-30 14:28:59 +08:00
    Stream.of(w1, w2, ...).anyMatch(w -> w.matches("[01]"))
    lululau
        32
    lululau  
       2020-12-30 14:29:20 +08:00
    Stream.of(w1, w2, ...).anyMatch(w -> !w.matches("[01]"))
    Cbdy
        33
    Cbdy  
       2020-12-30 14:29:30 +08:00
    Stream.of(w1, w2, w3, w4, w5).allMatch(List.of("0", "1")::contains);
    Lemeng
        34
    Lemeng  
       2020-12-30 14:34:26 +08:00
    正则好写
    otakustay
        35
    otakustay  
       2020-12-30 14:44:56 +08:00
    容易玩脱的办法:把 0 和 1 拼起来变二进制再转数字,然后用位操作判断
    laqow
        36
    laqow  
       2020-12-30 14:56:04 +08:00 via Android
    如果是用户界面的话就几个控件单次运算的,这么写写可以的吧
    Joker123456789
        37
    Joker123456789  
       2020-12-30 15:31:54 +08:00
    枚举啊,不是 0 和 1 赋值不进去, 然后判空即可。
    KarmaWu
        38
    KarmaWu  
       2020-12-30 16:07:39 +08:00   ❤️ 2
    Stream.of(w1, w2, w3, w4, w5, w6, w7).allMatch(List.of("0", "1")::contains);
    Vegetable
        39
    Vegetable  
       2020-12-30 16:57:28 +08:00
    太逗了吧,字符串拼起来正则一下如何。
    weidaizi
        40
    weidaizi  
       2020-12-30 17:48:43 +08:00
    感觉回复挺火热的,但是出现这种丑陋的检测,难道不是之前类型的设计思路出问题了吗? 改这里多半不是好的办法
    corningsun
        41
    corningsun  
       2020-12-30 18:01:53 +08:00
    提醒下,open 前面有个 `!`,只对 open 有效。建议写好单元测试再重构


    https://gist.github.com/corningsun/1afdd69da58d3ed7888ce022be76d4da
    Gwkang
        42
    Gwkang  
       2020-12-30 19:33:42 +08:00 via Android
    变参加递归
    akira
        43
    akira  
       2020-12-30 23:34:24 +08:00   ❤️ 1
    既然你只是要过 chekcstyle 。。。

    if (!(open.equals("0") || open.equals("1")) ) {
    throw new Exception("设置项目参数非法!");
    }
    if (!(w1.equals("0") || w1.equals("1")) ) {
    throw new Exception("设置项目参数非法!");
    }
    if (!(w2.equals("0") || w2.equals("1")) ) {
    throw new Exception("设置项目参数非法!");
    }
    stevefan1999
        44
    stevefan1999  
       2020-12-31 03:14:40 +08:00
    真值表啊
    stevefan1999
        45
    stevefan1999  
       2020-12-31 03:19:19 +08:00
    草那這樣好了
    ```js
    const isAcceptable = str => /0|1/.matches(str)
    if ([open, w1, w2, w3, w4, w5, w6, w7].map(isAcceptable).filter(x => !x).length > 0) {
    throw new Exception("设置项目参数非法!");
    }
    ```
    ojbkojbk
        46
    ojbkojbk  
       2020-12-31 10:39:26 +08:00
    你这个参数应该是从接口传入的吧,在接口的入参用注解正则校验
    另外在 equals 的时候 ,常量放在前面,防止封装类型传入空报指针
    xx6412223
        47
    xx6412223  
       2020-12-31 10:48:33 +08:00
    这代码看着被人看了要被骂的
    weizhen199
        48
    weizhen199  
       2020-12-31 10:53:46 +08:00
    0000,0001,1101,0101

    lz 你看看这个像啥
    TheF00L
        49
    TheF00L  
       2020-12-31 14:16:07 +08:00
    枚举多好
    daryl
        50
    daryl  
       2020-12-31 15:18:31 +08:00
    枚举不行么?
    checkzhzzzzz
        51
    checkzhzzzzz  
       2020-12-31 15:27:37 +08:00
    map.put(str,"");
    map.size()
    SkyLine7
        52
    SkyLine7  
       2021-01-04 15:19:36 +08:00
    枚举
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1908 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 16:20 · PVG 00:20 · LAX 08:20 · JFK 11:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.