代码之家  ›  专栏  ›  技术社区  ›  John Lippson

Java中的缩写或表达式?

  •  1
  • John Lippson  · 技术社区  · 8 年前

    我一直好奇是否可以简化Java或表达式Java。例子:

    int mapVal = occurrenceMap.get(node.nextNode.nodeVal);
    
    if (mapVal != null || mapVal != 5 )
    

    与…

    if (occurrenceMap.get(node.nextNode.nodeVal) != ( null || 1) )
    

    在我看来,第二种语言可读性更强,但我想知道这种语言是否支持这样的功能。

    4 回复  |  直到 8 年前
        1
  •  4
  •   Youcef LAIDANI    8 年前

    if (occurrenceMap.get(node.nextNode.nodeVal) != ( null || 1) )

    第二个更容易阅读,但不知道该语言是否支持 像这样。

    没有Java不支持。

    对于一个好的解决方案,我想使用:

    Integer i = occurrenceMap.get(node.nextNode.nodeVal);
    if (i != null || i != 1)
    

    注: 作为 Tim Biegeleisen 一般来说,注释原语int或类型中的引用不能是Java中的NULL。

        2
  •  6
  •   Joop Eggen    8 年前

    使用 getOrDefault

    occurrenceMap.getOrDefault(node.nextNode.nodeVal, 5) != 5 
    
        3
  •  0
  •   Sweeper    8 年前

    第一, int 不能 null .你不需要检查 无效的 如果你有 利息 .只是 不能 发生。

    下面是一个检查值是否等于值列表的方法:

    public static <T> boolean anyEquals(T value, T... values) {
        for (T val: values) {
            if (val == value) { // or val.equals(value)
                return true;
            } 
        }
        return false;
    
        // implementation with streams
        // return Arrays.stream(values).anyMatch(x -> x == value); // or x.equals(value)
    }
    

    用法(假设您正在使用 Integer S而不是 利息 )以下内容:

    Integer i = ...;
    boolean b = anyEquals(i, 5, 10, 15);
    
        4
  •  0
  •   mroman    8 年前

    如果你想简化布尔表达式,你应该学习一些公理和定律:

    • 你看!!A=A
    • (!A A)=真
    • (!A&A)=假
    • (正确&A)=A
    • (假)=假
    • (真A)=真
    • (假a)=a
    • (!A!b)=!(A&B)
    • (!A&&!b)=!(A B)
    • (A!=b)=!(a==b)
    • (a<=b)=(b>a)
    • (a>=b)=(b<a)

    你提到的第二个不可能用在 爪哇因为 (a || b) 已经有了意义所以 a == (c || d) 已经有了固定的含义,改变它可能会破坏很多代码。在那里 可以 是支持此类符号的语言,但它们将使用不同的运算符而不是二进制布尔运算符,因为否则将无法区分程序员真正想要的是什么。

    您可以绝对地将这样的特性添加到Java中,但是您必须创建一个新的操作符来执行此操作。但到现在为止,Java没有这个,大多数语言都没有。

    有些语言允许您执行“A<B<C”等并非所有语言都支持的操作(您必须编写“A<B和B<C”)。

    从技术上讲,您可以为此创建助手函数,例如 “如果是isoneof(mapval,a,b)”,但这可能不会被广泛使用(最重要的是,因为这样做需要一些运行时技巧)。