V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
nutting
V2EX  ›  Java

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

  •  1
     
  •   nutting · Dec 30, 2020 · 7156 views
    This topic created in 1948 days ago, the information mentioned may be changed or developed.
    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 replies    2021-01-04 15:19:36 +08:00
    haoz1w0w
        1
    haoz1w0w  
       Dec 30, 2020
    >1 不就行了
    boris93
        2
    boris93  
       Dec 30, 2020 via Android
    就不能用 bool ?
    jimliang
        3
    jimliang  
       Dec 30, 2020
    人才
    flyfanc
        4
    flyfanc  
       Dec 30, 2020
    Arrays.asList("1", "0").containsAll(Arrays.asList(w1,w2,w3,…));
    jintianfengda
        5
    jintianfengda  
       Dec 30, 2020   ❤️ 1
    抽出来方法封装呗
    public boolean checkAll(String... args){}
    代码洁癖患者提醒,最好使用"1".equals(open)哦,01 用枚举替代
    nutting
        6
    nutting  
    OP
       Dec 30, 2020
    @haoz1w0w 没写清楚,是字符的 0 或者 1

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


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


    @flyfanc 你这个写法我研究一下
    Gilgamesh7
        7
    Gilgamesh7  
       Dec 30, 2020
    假设接收参数的是 body,使用 validation 注解校验参数,然后字段注解使用 @Pattern,写个正则判断一下是字符串 0 或 1
    yuk1no
        8
    yuk1no  
       Dec 30, 2020 via iPhone
    Stream.of(x, y, z).allMatch(s -> s.equals("0") || s.equals("1"));
    chendy
        9
    chendy  
       Dec 30, 2020   ❤️ 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  
       Dec 30, 2020 via Android
    r = a∣ b ∣c ...
    r = r & 0

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

    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  
       Dec 30, 2020 via Android   ❤️ 1
    拼起来用正则
    zhuawadao
        18
    zhuawadao  
       Dec 30, 2020
    把这几个变量直接拼成字符串,然后用正则看是否只有 0 或只有 1
    lonelinsky
        19
    lonelinsky  
       Dec 30, 2020 via Android   ❤️ 1
    new 一个 Set, 然后变量全 put 然后检查 Set 的 size 和 content
    yanhh
        20
    yanhh  
       Dec 30, 2020   ❤️ 1
    这种都是用二进制掩码来做,楼主应该没写过底层一点的东西,哈哈,可以看看最靠近的 WinAPI,里边有很多。
    zunceng
        21
    zunceng  
       Dec 30, 2020
    开个脑洞 设计个注解式的 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  
       Dec 30, 2020
    说二进制的朋友们……没看到楼主的是字符串么
    LGA1150
        23
    LGA1150  
       Dec 30, 2020
    if (Stream.of(open, w1, w2).anyMatch(x -> !"0".equals(x) && !"1".equals(x))) throw ...
    marcong95
        24
    marcong95  
       Dec 30, 2020
    Pattern.matches("[01]{8}", open+w1+w2+w3+w4+w5+w6+w7)
    Flywith24
        25
    Flywith24  
       Dec 30, 2020   ❤️ 2
    hfc
        26
    hfc  
       Dec 30, 2020   ❤️ 6
    new 个 set,初始只有字符串的 0 和 1,后续把上面这一串变量往里面塞,最后 set.size()>2 就是存在非法参数
    phpfpm
        27
    phpfpm  
       Dec 30, 2020
    你拆成多个 if-elseif 多好
    这样 throw 的时候你还有在哪出问题的 context
    sutra
        28
    sutra  
       Dec 30, 2020
    Ranying
        29
    Ranying  
       Dec 30, 2020
    遍历这些变量拼接的字符串
    liyanggyang
        30
    liyanggyang  
       Dec 30, 2020
    @yuk1no 这个可
    lululau
        31
    lululau  
       Dec 30, 2020
    Stream.of(w1, w2, ...).anyMatch(w -> w.matches("[01]"))
    lululau
        32
    lululau  
       Dec 30, 2020
    Stream.of(w1, w2, ...).anyMatch(w -> !w.matches("[01]"))
    Cbdy
        33
    Cbdy  
       Dec 30, 2020
    Stream.of(w1, w2, w3, w4, w5).allMatch(List.of("0", "1")::contains);
    Lemeng
        34
    Lemeng  
       Dec 30, 2020
    正则好写
    otakustay
        35
    otakustay  
       Dec 30, 2020
    容易玩脱的办法:把 0 和 1 拼起来变二进制再转数字,然后用位操作判断
    laqow
        36
    laqow  
       Dec 30, 2020 via Android
    如果是用户界面的话就几个控件单次运算的,这么写写可以的吧
    Joker123456789
        37
    Joker123456789  
       Dec 30, 2020
    枚举啊,不是 0 和 1 赋值不进去, 然后判空即可。
    KarmaWu
        38
    KarmaWu  
       Dec 30, 2020   ❤️ 2
    Stream.of(w1, w2, w3, w4, w5, w6, w7).allMatch(List.of("0", "1")::contains);
    Vegetable
        39
    Vegetable  
       Dec 30, 2020
    太逗了吧,字符串拼起来正则一下如何。
    weidaizi
        40
    weidaizi  
       Dec 30, 2020
    感觉回复挺火热的,但是出现这种丑陋的检测,难道不是之前类型的设计思路出问题了吗? 改这里多半不是好的办法
    corningsun
        41
    corningsun  
       Dec 30, 2020
    提醒下,open 前面有个 `!`,只对 open 有效。建议写好单元测试再重构


    https://gist.github.com/corningsun/1afdd69da58d3ed7888ce022be76d4da
    Gwkang
        42
    Gwkang  
       Dec 30, 2020 via Android
    变参加递归
    akira
        43
    akira  
       Dec 30, 2020   ❤️ 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  
       Dec 31, 2020
    真值表啊
    stevefan1999
        45
    stevefan1999  
       Dec 31, 2020
    草那這樣好了
    ```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  
       Dec 31, 2020
    你这个参数应该是从接口传入的吧,在接口的入参用注解正则校验
    另外在 equals 的时候 ,常量放在前面,防止封装类型传入空报指针
    xx6412223
        47
    xx6412223  
       Dec 31, 2020
    这代码看着被人看了要被骂的
    weizhen199
        48
    weizhen199  
       Dec 31, 2020
    0000,0001,1101,0101

    lz 你看看这个像啥
    TheF00L
        49
    TheF00L  
       Dec 31, 2020
    枚举多好
    daryl
        50
    daryl  
       Dec 31, 2020
    枚举不行么?
    checkzhzzzzz
        51
    checkzhzzzzz  
       Dec 31, 2020
    map.put(str,"");
    map.size()
    SkyLine7
        52
    SkyLine7  
       Jan 4, 2021
    枚举
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2439 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 122ms · UTC 05:25 · PVG 13:25 · LAX 22:25 · JFK 01:25
    ♥ Do have faith in what you're doing.