Java与Javascript的OR的最佳等价物是什么?



在Javascript中,我可以执行以下操作,根据它们在赋值中各自的出现顺序来获取值。

var myString = source1 || source2 || source3 || source4 || source5;

如果任何源具有值,它将被分配给 myString。如果所有来源都有价值,它将采用第一个。

在 Java 中,java.util.Optional似乎仅限于 Optional.of("value").orElse( "another" ) 并且它不能再链接,因为 orElse(( 的返回已经是一个字符串。

我可能会使用一些简单的东西,例如:

public static <T> T first(T... values) {
    for (T v : values) {
        if (v != null) return v;
    }
    return null;
}

虽然可以说有很多方法,但我更喜欢以下方法:

Integer i = Stream.of(null, null, null, null, null, null, null, null, 1, 2)
                  .filter(Objects::nonNull) // filter out null's
                  .findFirst().orElse(10); // default to 10
// Objects::nonNull is same as e -> e != null
System.out.println(i);

只是为了发布流 API 的非流替代方案

如果您只有非常小的字符串集要与非空值进行比较,您可能希望节省初始化流、lambda 等的开销。

您可以使用...的三个点来表示"任意数量的参数",这些参数在您的方法中将有效地转换为String[] arguments

然后迭代它们并将它们与您的自定义比较函数进行比较。在这种情况下,我选择使用非空字符串而不是空字符串来模拟 javascript。根据需要进行修改。

public String sourceFilter(String... input) {
    for(String test : input) {
        if(test != null && !test.isEmpty()) {
            return test;
        }
    }
    return "";
}

我不知道在这种情况更有效的盈亏平衡点是什么,但我想这将是一个相当高的数字来支付它的初始化成本。

最新更新