nutting
V2EX  ›  Java

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

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

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


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


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

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

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


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

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