使用复杂表达式初始化变量

Initialize variable with complex expression

在 Java 8 中有没有一种方法可以使用复杂表达式的结果同时声明和初始化一个 final 变量?

换句话说,是否可能是下面这样的情况?

final int x = [capturedVariable] {
    switch (capturedVariable) {
    case 1: return 42;
    case 2: return 84;
    default: return 66;
    }
};

虽然语法明显 "creative",但我希望意图是明确的。

编辑 1:虽然这个特定示例可以使用三元运算符编写,但它只是一个复杂表达式的示例,我正在寻找通用解决方案。

编辑 2:也许以下是看待这个问题的一种较少争议的方式:在 [= 中同时声明和调用 lambda/closure 的语法是什么26=]8?

似乎有些矫枉过正,但您可以使用 Supplier:

final int x = new Supplier<Integer>() {
    public Integer get() {
        // Complexity here
        return result;
    }
}.get();

我确定这是我的Java-fu 弱 (我猜不是),但唯一的办法我可以让 lambda 版本工作是在某处有一个可重用的 call 实用函数:

class Utils {
    public static <T> T call(Supplier<T> x) {
        return x.get();
    }
}

...然后:

final int x = Utils.call(() -> {
    // Complexity here
    return result;
});

Matthias points out in a comment (refined by Aominè) 你可以避免那个中间函数,但它并不比上面的第一个解决方案漂亮多少:

final int x = ((Supplier<Integer>) () -> {
    // Complexity here
    return result;
}).get();

...但至少不需要生成 class.

您可以创建自己的接口,创建一个初始化方法,该方法接受一个 init 和 return 另一个 int 例如:

Init i = (x) -> {
    switch (x) {
        case 1:
            return 42;
        case 2:
            return 84;
        default:
            return 66;
    }
};
final int x = i.init(1);

...

interface Init {
    int init(int x);
}

我不明白 Java 8 在这里有什么关系,你可以在多个地方分配一个 final 变量,只要你总是分配它并且只分配一次,例如这是合法的 Java 代码(假设 blah 是一个有效的布尔值):

final int test;
if (blah) {
  test = 1;
} else {
  test = 2;
}

表达式可以很复杂,只要编译器能够确定地证明您总是初始化变量一次且仅一次。 (例如循环会使它失败)。