将条件或应用于变量

Apply conditional OR to a variable

有一个用零初始化的变量,如果与它相比有一个不同于零的值,我想改变它的值。这个东西在 Javascipt 中有效,但在 Java.

中似乎无效
int val = 0;
for (int i = 0; i < anArrayOfObjects.length; i++) {
    val = val || anArrayOfObjects[i].length;
}
return val;

错误说:

Operator '||' cannot be applied to 'int', 'int'

应该如何更改才能工作?

而不是val = val || anArrayOfObjects[i];,也许试试
val = (anArrayOfObjects[i] > 0 ? anArrayOfObjects[i] : val)

仅当 val 大于 0 时才用新值更新它。

试试这个

int val = 0;
for (int i = 0; i < anArrayOfObjects.length; i++) {
  if(val!=0){
  val = anArrayOfObjects[i].length;
  }  
}
return val;

来自 JLS - 15.24。条件或运算符 || :

Each operand of the conditional-or operator must be of type boolean or Boolean, or a compile-time error occurs.

你需要用不同的方式来处理这个问题,也许是这样的:

val = val != 0 ? val : anArrayOfObjects[i].length;

JavaScript 中的逻辑运算符 || 可用于任何原始值或对象。其结果将基于值是 truthy 还是 falsy.

你可以写一个三元运算符。

val = val == 0 ? anArrayOfObjects[i].length : val;

基本上,您需要做的是找到第一个非零 anArrayOfObjects[i].length 或 return 0 if none。 Stream API 方法可能是更直观的选择。

Stream.of(anArrayOfObjects)
        .mapToInt(i -> i.length)
        .filter(i -> i != 0)
        .findFirst()
        .orElse(0);
int val = 0;
for (int i = 0; i < anArrayOfObjects.length && val == 0; i++) {
    val = anArrayOfObjects[i].length;
}
return val;

或者

return Stream.of(anArrayOfObjects)    // Stream<T[]>
    .mapToInt(o -> o.length)          // IntStream
    .filter(len -> len != 0)
    .findFirst()                      // OptionalInt
    .orElse(0);                       // int

为了提供一些上下文(其他答案涵盖了 'java way' 已经做到这一点),0 值是 'false' 的概念通常被称为“在这种语言中,0 是假的。在大多数语言中,事物都是 truthy(如果用在只接受布尔值的地方,它被视为与 true 相同),除非它们在显式列表中虚假 事物。

问题是,列表中的语言不一致。这会造成无穷无尽的混乱。 nullundefined(如果一种语言有这个概念)普遍是虚假的。但在那之后它变得更加复杂。空字符串是假的吗?是一个空列表吗?具有迭代器选项的自定义数据类型怎么样?如果您要调用它,它将 return 没有元素?例如,引用 0 个 DOM 元素的 jQuery 选择器对象是 truthy 还是 falsy?

字符串"0"呢?它在很多地方充当 int 0,所以它应该是 falsy 吗?

更奇怪的是,在linux shell(例如/bin/bash)中,数字的情况是相反的; 0 是真实的,所有其他值都是虚假的。这看起来很荒谬,但在 bash 等的范围内实际上是有意义的:进程可以 return 一个字节作为 'error value',而 0 是 bash 的通用指示符=50=],因此 bash 与数字的逆 truthy/falsy 一起工作。 truthy 匹配 'no errors',falsy 匹配 'some errors',这是一种明智的做法。

这让我们得到 java:Java 决定通过 truthy/falsy 在语言中保存的几个字符绝对不值得添加的复杂性和混乱这将需要。因此,java 是绝对的。 true 是真实的。 false 是假的。如果在布尔上下文中使用,所有其他值都是编译器错误。

也就是说:不,java 不允许您使用 someIntExpr || defaultValue 作为重写 0 值的快速方法,而且至关重要的是,永远*不会。为此尝试 someIntExpr == 0 ? defaultValue : someIntExpr,或将其直接集成到您的 API 调用中,因此不要写:someHashMap.get("someKey") || "default",它不是 java 并且不会编译,请尝试:someHashMap.getOrDefault("someKey", "default")。这不是唯一一个内置支持传递默认值的 java API。

*) 意见当然可以改变,但让我们这样说:极度不太可能有足够多的社区和核心提交者改变他们的想法并允许更改语言以引入更多真实和虚假的东西。