繁体   English   中英

foreach语法中的三元运算符

[英]Ternary operator in a foreach syntax

我有两个String集合: String... columns KeySet<String>这只是一个简单数组和一个KeySet<String>

for(String it : columns) // works
for(String it : FIELDS.keySet()) // works
for(String it : ((columns.length > 0) ? columns : FIELDS.keySet())) // doesn't.

Foreach不适用于类型Object。

这是为什么?

当您在三元组中使用两个表达式作为两个备选方案时,Java需要确定它们的共同类型是什么,以便确定表达式的类型。

由于columnsString[] ,而FIELDS.keySet()Set<String> ,所以最好的通用类型是java.lang.Object 每个单独的类型都支持迭代,但不支持通用基本类型。 这就是为什么您会得到一个错误。

您可以通过将columns转换为Set<String>或将FIELDS.keySet()转换为String[]来解决此问题:

Set<String> keySet = FIELDS.keySet();
String[] keyArray = keySet.toArray(new String[keySet.size()])
for(String it : ((columns.length > 0) ? columns : keyArray)) {
    ...
}

(根据评论)在我看来,转换不值得。 if for(x) else for(y)会更适合,这很简单if for(x) else for(y)因为它是一个单行循环,比复制的消耗少。

效率更高的另一个原因是Java编译器能够生成效率更高的代码。 正如TJ Crowder 下面的评论中指出的那样,

[Java]编译器必须为它们发出不同的代码,具体取决于它是处理数组还是Iterable

使用两个foreach可使编译器选择一个更适合集合类型的增强循环,而不是将两个集合都塞入相同类型的对象中。

这是因为三元运算符的两个部分必须共享相同的通用类型,才能使它们符合for-each构造。 for-each构造期望使用Object[]Iterable

在您的情况下,一个是array ,另一个是Set 这两种类型最接近的共同父ObjectObject ,因此成为三元表达式的最终类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM