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

Java 使用复杂表达式初始化变量,java,lambda,anonymous-inner-class,Java,Lambda,Anonymous Inner Class,Java 8中有没有一种方法可以同时声明和初始化带有复杂表达式结果的final变量 换句话说,像下面这样的事情是可能的吗 final int x = [capturedVariable] { switch (capturedVariable) { case 1: return 42; case 2: return 84; default: return 66; } }; 虽然语法显然是“创造性的”,但我希望意图是明确的 编辑1:虽然这个特殊的例子可以使用

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

换句话说,像下面这样的事情是可能的吗

final int x = [capturedVariable] {
    switch (capturedVariable) {
    case 1: return 42;
    case 2: return 84;
    default: return 66;
    }
};
虽然语法显然是“创造性的”,但我希望意图是明确的

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


编辑2:也许看待这个问题的争议性较小的方式是以下内容:在Java 8中同时声明和调用lambda/closure的语法是什么?

似乎有些过火,但您可以使用
供应商

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

final int x = Utils.call(() -> {
    // Complexity here
    return result;
});
在评论中指出(由改进),您可以避免该中介功能,但它并不比上面的第一个解决方案漂亮多少:

final int x = ((Supplier<Integer>) () -> {
    // Complexity here
    return result;
}).get();
final int x=((供应商)()->{
//这里的复杂性
返回结果;
}).get();

…但至少它不需要生成类。

您可以创建自己的接口—一个create init方法,该方法接受一个init并返回另一个int,例如:

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


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


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

写一个方法<代码>最终整数x=someMethod(capturedVariable)这当然是一个有效的解决方案,但我正在寻找一种不引入一次性函数(这也打破了从上到下的阅读顺序)的方法;{switch(capturedVariable){case1:x=42;break;case2:x=84;break;default:x=66;}}。它比你建议的语法要短…关于这个快速否决的投票有什么解释吗?在未经训练的人看来,这可能不是有效的代码。或者有人对您无法内联lambda感到失望。此版本的lambda看起来没有更好的最终整数a=((供应商)(()->{return 1;})).get()@马蒂亚斯:谢谢。我真的希望有一个比这更整洁的方法,或者我上面的
调用
函数。感谢T.J.Crowder和@Matthias,至少你的回答说明了如何使用lambdas实现这一点,而且Java中没有一个很好的解决方案。有很多很好的解决方案,你只是不喜欢它们。这使得整个问题都是基于意见的,如果不是的话,答案都是变化的,所以方法都是一样的,都是向上投票的。谢谢!我的任务是在工作中编写Java,但我已经几十年没有使用过这种语言了。来自C++背景的,我期待着最终< /COD>必须在声明点初始化局部变量,比如C++中的代码> const < /Cord>变量,但我想不是这样的。谢谢你的回答。我不知道为什么我会读到这个选项是不在桌面上的问题(我想是我,而不是问题)。如果不是(表外),这显然是最好的方法。@t.J.Crowder这个问题可以从多种不同的角度来理解,因此我认为我们应该确保涵盖最简单的选项:D@Françoisbaune Java也有“有效最终”的概念,您可能会觉得读起来很有趣。
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);
}
final int test;
if (blah) {
  test = 1;
} else {
  test = 2;
}