在Javascript中,我可以按照分配中各自的出现顺序来获取值。
var myString = source1 || source2 || source3 || source4 || source5;
如果任何来源有值,它将被分配给myString。如果所有来源都有价值,那么它将占据第一个。
在Java中,java.util.Optional
似乎仅限于Optional.of("value").orElse( "another" )
,并且它不能再链接,因为orElse()的返回已经是一个字符串。
答案 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 "";
}
我不知道收支平衡点是什么,在这种情况下流更有效,但我想它会覆盖初始化成本,这是一个非常高的数字。