在Java中缩小或/和表达式?

在Java中缩小或/和表达式?,java,Java,我一直很好奇,是否有可能简化Java或Java表达式。例如: int mapVal = occurrenceMap.get(node.nextNode.nodeVal); if (mapVal != null || mapVal != 5 ) 对 if (occurrenceMap.get(node.nextNode.nodeVal) != ( null || 1) ) 在我看来,第二种语言更具可读性,但我想知道这种语言是否支持这样的东西 if(occurrenceMap.get(node

我一直很好奇,是否有可能简化Java或Java表达式。例如:

int mapVal = occurrenceMap.get(node.nextNode.nodeVal);

if (mapVal != null || mapVal != 5 )

if (occurrenceMap.get(node.nextNode.nodeVal) != ( null || 1) )
在我看来,第二种语言更具可读性,但我想知道这种语言是否支持这样的东西

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

第二种更具可读性,但不知道该语言是否支持 像这样的

不,Java不支持这一点

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

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

注意:注释中提到的基本int或type在Java中一般不能为null

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

第二种更具可读性,但不知道该语言是否支持 像这样的

不,Java不支持这一点

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

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


注意:如注释中所述,Java中的原语int或type一般不能为null。

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

  • !!a=a
  • (!a | | a)=真
  • (!a&&a)=错误
  • (真和a)=a
  • (false&&a)=false
  • (真| | a)=真
  • (假| a)=a
  • (!a | |!b)=!(a和b)
  • (!a&&!b)=!(a | | b)
  • (a!=b)=!(a==b)
  • (a)
  • (a>=b)=(b
你提到的第二个不可能用在 Java因为
(a | | b)
已经有了意义,所以
a==(c | | d)
已经有了固定的意义,更改它可能会破坏很多代码。可能有支持这种符号的语言,但它们将使用不同的运算符而不是二进制布尔运算符,因为否则就不可能区分程序员真正想要什么

您完全可以向Java添加这样一个特性,但您必须创建一个新的操作符才能做到这一点。但到目前为止:Java没有这个功能,大多数语言也没有

有些语言允许您执行“a 从技术上讲,您可以为此创建助手函数,例如
“if isOneOf(mapVal,a,b)”但这可能不会被广泛使用(最重要的是,这需要一些运行时技巧来实现)

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

  • !!a=a
  • (!a | | a)=真
  • (!a&&a)=错误
  • (真和a)=a
  • (false&&a)=false
  • (真| | a)=真
  • (假| a)=a
  • (!a | |!b)=!(a和b)
  • (!a&&!b)=!(a | | b)
  • (a!=b)=!(a==b)
  • (a)
  • (a>=b)=(b
你提到的第二个不可能用在 Java因为
(a | | b)
已经有了意义,所以
a==(c | | d)
已经有了固定的意义,更改它可能会破坏很多代码。可能有支持这种符号的语言,但它们将使用不同的运算符而不是二进制布尔运算符,因为否则就不可能区分程序员真正想要什么

您完全可以向Java添加这样一个特性,但您必须创建一个新的操作符才能做到这一点。但到目前为止:Java没有这个功能,大多数语言也没有

有些语言允许您执行“a 从技术上讲,您可以为此创建助手函数,例如
“if isOneOf(mapVal,a,b)”但这可能不会被广泛使用(最重要的是,这需要一些运行时技巧来实现)

首先,
int
不能为
null
。如果有
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)
}

首先,
int
不能为
null
。如果有
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)
}
使用

使用


我可以通过不进行两次
get
调用来缩短它。分配一次,计算两次。第二个表达式有两种含义。将根据返回的值检查
get
值,还是同时检查这两个值?因为布尔表达式
X | | Y
将返回布尔值。请不要更改问题的上下文!Java不支持运算符重载。在Kotlin中使用
in
运算符可以实现您真正想要的功能,并且对于任何类型都可以重载。我可以通过不进行两次
get
调用来缩短它。赋值一次,求值两次。第二个表达式有两种含义。将根据返回的值检查
get
值,还是同时检查这两个值?因为布尔表达式
X | | Y
将返回布尔值。请不要更改问题的上下文!Java不支持运算符重载。在Kotlin中使用
in
操作符可以实现您真正想要的功能,并且可以为任何type@TimBiegeleisen更正OP把他的问题从第一个版本改过来了我认为这是一个Integer@TimBiegeleisen更正OP把他的问题从第一个版本改过来了,我想这是一个整数,上面写着“类似这样的东西”。他知道他不能用Java那样写。他想知道是否有一个语法来“因子”条件。这是有道理的。这太令人困惑了。OP说“像这样的东西”。他知道他不能用Java那样写。他想知道是否有一个语法来“因子”条件。这是有道理的。这太让人困惑了。你的视野真的很不一样,很真实