java支持条件语句中的内联声明和赋值吗?

java支持条件语句中的内联声明和赋值吗?,java,Java,第一条路(成功): 否,java不支持条件语句中的内联声明和赋值。否,语句中变量的内联声明不仅在for循环中有效 它在try with resource语句中也有效: 。。。 资源规范使用变量来表示try语句的资源,方法是使用初始化表达式声明局部变量,或者 例如: try (var rd = new BufferedReader(...)) { ... } 搜索页面后,我相信只有两个for语句和try-with-resource语句接受这种声明(尽管有Lambda表达式) 确认人:

第一条路(成功):


否,java不支持条件语句中的内联声明和赋值。

否,语句中变量的内联声明不仅在for循环中有效

它在try with resource语句中也有效:

。。。 资源规范使用变量来表示try语句的资源,方法是使用初始化表达式声明局部变量,或者

例如:

try (var rd = new BufferedReader(...)) {
    ...
}

搜索页面后,我相信只有两个
for
语句和
try
-with-resource语句接受这种声明(尽管有Lambda表达式)


确认人:

除了局部变量声明语句外,局部变量还可以通过基本
for
语句()、增强的
for
语句()或
try
-with resources语句()的头声明


否,赋值中的类型声明无效

另外,您不能将在右侧声明的变量用作初始化的一部分,因为您将得到一个编译器错误,即变量“可能未初始化”

此外,可以使用复合变量声明,每个声明之间用逗号分隔,但它们必须是同一类型

例如,有效的变量声明和初始化如下:

double  newMed =0, 
        median = 1,
        minMed = (newMed = median) < median ? newMed : 0;
double newMed=0,
中位数=1,
minMed=(newMed=中值)<中值?newMed:0;

请注意,要定义“minMed”,我使用的变量已被日化,否则会出现编译器错误。

除非我遗漏了什么,否则更明智的做法是使用
stream()
列表并根据
中值映射到
双精度
,然后找到最小值。大概

double minMed = lis.stream().mapToDouble(x -> x.median).min().orElse(0);

你的第二条路毫无意义;遵循Java的作用域,newMed将在调用结束后立即被丢弃,因此允许声明将是无用和麻烦的。其次,for循环内的声明不是内联声明;try/resource控制语句也是如此。这个结构被分解成几个字节码“行”,但仍然被包装在自己的范围内。例如,C#有一个缺点,它基本上也这样做,只是没有将所有字节码包装在自己的范围内。因此,在循环外使用与另一个变量同名的for变量,即使稍后(在循环后)声明,也不能使用该名称两次,因为在C#字节码中,它已经由“展开”/“分解结构”循环声明。正如您尝试过的,并得到了编译错误,你为什么这么问?@user207421你可以推断我对类似的方法感兴趣。我应该在问题中明确这一点吗?这个问题的结束不一定遵循典型的指导原则。这不是打字错误或类似的错误。但在任何情况下,问题都会通过代码和注释澄清进行更新,以改进它。提到的特定功能与其他java语言功能类似,并且在其他一些语言(例如python)中有直接的等效功能。有一个合理(且被接受)的答案可以提供有用的信息。这似乎是最完整和最直接适用的答案。但是,即使允许在条件语句中使用,也很难阅读/理解(对于
minMed=(newMed=median)
)-我想要两个不同的任务
try (var rd = new BufferedReader(...)) {
    ...
}
double  newMed =0, 
        median = 1,
        minMed = (newMed = median) < median ? newMed : 0;
double minMed = lis.stream().mapToDouble(x -> x.median).min().orElse(0);