在Java中返回null时,如何评估下一个语句?

时间:2015-12-29 12:12:55

标签: java java-8 java-stream

如何在Java中执行类似以下JavaScript代码的操作?

var result = getA() || getB() || getC() || 'all of them were undefined!';

我想要做的是继续评估语句或方法,直到它得到一些而不是null

我希望调用者代码简单有效。

3 个答案:

答案 0 :(得分:8)

你可以为它创建一个方法。

val identity=Await.result(future, timeout.duration).asInstanceOf[ActorIdentity]   

代码取自:http://benjiweber.co.uk/blog/2013/12/08/null-coalescing-in-java-8/

编辑正如评论中所述。在下面找到一个小片段如何使用它。使用public static <T> T coalesce(Supplier<T>... ts) { return asList(ts) .stream() .map(t -> t.get()) .filter(t -> t != null) .findFirst() .orElse(null); } API比使用Stream作为方法参数更有优势。如果方法返回的值很昂贵而且简单的getter不返回,vargs解决方案将首先评估所有这些方法。

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方法之前,将评估返回值的所有方法。

答案 1 :(得分:4)

如果您真的想使用java8流API,请查看SubOptimal的解决方案。

在纯Java中,你不能像在javascript中那样写一行:java会更详细。

如果你的吸气剂不耗费时间/资源,而且你不关心它们两次,你可以这样做:

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";
        }
    }
}

答案 2 :(得分:0)

您也可以使用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();
}