[英]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需要确定它们的共同类型是什么,以便确定表达式的类型。
由于columns
是String[]
,而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
。 这两种类型最接近的共同父Object
是Object
,因此成为三元表达式的最终类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.