Java ,多个变量都只允许是 0 或 1,怎么写简单 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nutting
V2EX    Java

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

  •  1
     
  •   nutting 2020-12-30 11:44:19 +08:00 6864 次点击
    这是一个创建于 1799 天前的主题,其中的信息可能已经有所发展或是发生改变。
    if (!(open.equals("0") || open.equals("1")) && (w1.equals("0") || w1.equals("1"))
    && (w2.equals("0") || w2.equals("1")) && (w3.equals("0") || w3.equas("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
    rb6221
        11
    rb6221  
       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)) {
    i (!arg.equals("0") && !arg.equals("1")) {
    throw new Exception("Invalid arg: " + arg);
    }
    }
    ```
    xe2vherd
        14
    xe2vherd  
       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("设置项目参数非法!");
    }
    JQD6r41PkI4o2mEz
        17
    JQD6r41PkI4o2mEz  
       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     Solana     933 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 20:28 PVG 04:28 LAX 12:28 JFK 15:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86