什么是Java最适合Javascript的OR?

时间:2018-03-21 07:56:44

标签: java java-8

在Javascript中,我可以按照分配中各自的出现顺序来获取值。

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

如果任何来源有值,它将被分配给myString。如果所有来源都有价值,那么它将占据第一个。

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

3 个答案:

答案 0 :(得分:6)

我可能会使用简单的东西:

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

答案 1 :(得分:4)

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

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);

答案 2 :(得分:2)

只是发布一个非流替换流api

如果你只想要非常小的字符串集与非空值进行比较,你可能希望节省初始化流,lambdas等的开销。发生在幕后的事情。

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

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

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

我不知道收支平衡点是什么,在这种情况下流更有效,但我想它会覆盖初始化成本,这是一个非常高的数字。