如何在Java中执行以下JavaScript代码?
var result = getA() || getB() || getC() || 'all of them were undefined!';
我想做的是继续评估语句或方法,直到它得到一些东西而不是null
。
我希望调用方代码简单有效。
您可以为它创建一个方法。
public static <T> T coalesce(Supplier<T>... ts) {
return asList(ts)
.stream()
.map(t -> t.get())
.filter(t -> t != null)
.findFirst()
.orElse(null);
}
代码取自:http://benjiweber.co.uk/blog/2013/12/08/null-coalescing-in-java-8/
编辑如评论中所述。在下面找到一个如何使用它的小片段。使用Stream
API比使用vargs
作为方法参数有优势。如果这些方法返回的值代价高昂,并且不是由简单的getter返回的,那么vargs
解决方案将首先评估所有这些方法。
import static java.util.Arrays.asList;
import java.util.function.Supplier;
...
static class Person {
String name;
Person(String name) {
this.name = name;
}
public String name() {
System.out.println("name() called for = " + name);
return name;
}
}
public static <T> T coalesce(Supplier<T>... ts) {
System.out.println("called coalesce(Supplier<T>... ts)");
return asList(ts)
.stream()
.map(t -> t.get())
.filter(t -> t != null)
.findFirst()
.orElse(null);
}
public static <T> T coalesce(T... ts) {
System.out.println("called coalesce(T... ts)");
for (T t : ts) {
if (t != null) {
return t;
}
}
return null;
}
public static void main(String[] args) {
Person nobody = new Person(null);
Person john = new Person("John");
Person jane = new Person("Jane");
Person eve = new Person("Eve");
System.out.println("result Stream API: "
+ coalesce(nobody::name, john::name, jane::name, eve::name));
System.out.println();
System.out.println("result vargas : "
+ coalesce(nobody.name(), john.name(), jane.name(), eve.name()));
}
输出
called coalesce(Supplier<T>... ts)
name() called for = null
name() called for = John
result Stream API: John
name() called for = null
name() called for = John
name() called for = Jane
name() called for = Eve
called coalesce(T... ts)
result vargas : John
如输出中所示。在Stream
解决方案中,返回值的方法将在coalesce
方法中进行评估。只有两个被执行,因为第二个调用返回预期的non-null
值。在vargs
解决方案中,所有返回值的方法都会在调用coalesce
方法之前进行评估。
如果您真的想使用java8流API,那么看看SubOptimal的解决方案。
在纯Java中,您不能像在javascript中那样编写相同的行:Java将更加冗长。
如果你的getter不耗费时间/资源,并且你不在乎给他们打两次电话,你可以这样做:
String result = getA() != null ? getA() :
(getB() != null ? getB() :
(getC() != null ? getC() :
"default value"));
否则,你可以用普通if来做:
String result = getA();
if (result == null) {
result = getB();
if (result == null) {
result = getC();
if (result == null) {
result = "default value";
}
}
}
您还可以使用Java 8 Optional。例如
public static void main(String[] args) {
getA().orElse(getB().orElse(getC().orElse("Unknown")));
}
public static Optional<String> getA() {
return Optional.empty();
}
public static Optional<String> getB() {
return Optional.empty();
}
public static Optional<String> getC() {
return Optional.empty();
}