我正在解析excel文件,并且试图为“ IP”列找到索引。 下面的代码实际上将为我提供索引,但是该“ let”的返回值类型为Any。
如果数据与if语句匹配,是否有更漂亮的方法从迭代器中获取数据?
val ipColumn = headerRow.cellIterator().let {
it.forEach { cell ->
if ("IP" == formater.formatCellValue(cell))
return@let cell.columnIndex
}
}
答案 0 :(得分:2)
我假设您正在使用Apache POI库,其中cellIterator
是返回Iterator<Cell>
的方法。在这种情况下,您可以执行以下操作:
val ipColumn: Int? = headerRow.cellIterator()
.asSequence()
.firstOrNull {
"IP" == formatter.formatCellValue(it)
}
?.columnIndex
请注意,我没有测试代码,因此它甚至可能包含编译问题,但希望它能给您提示
答案 1 :(得分:1)
<partial name="" />
或List
您最好的选择是https://github.com/IdentityServer/IdentityServer4/pull/2344至Sequence
,在这里您可以调用Sequence
方法。
find()
val index = headerRow
.asSequence() //To sequence
.find { "IP" == formater.formatCellValue(it) }
如果出于某种原因您不能使用Iterator
,我真的不认为有一种更漂亮的方法(当然总会有)。但是,如果您的主要问题是从List
构造中获得了Any
类型,则始终可以let
来converting the iterator找到找到的索引,或者不确定索引的类型为as Int
,使用Int
,它将返回cast的Int:
as? Int
如果您仍然不喜欢这两个选项中的任何一个。或者,如果您想在更多地方使用该代码。您可以创建自己的nullable value:
val ipColumn = headerRow.cellIterator().let {
it.forEach { cell ->
if ("IP" == formater.formatCellValue(cell))
return@let cell.columnIndex
}
} as Int //This returns `Int`
将这些行放在代码中的任何位置后,您可以简单地调用:
fun Row.find(predicate: (Cell) -> Boolean): Cell?
= cellIterator().asSequence().find(predicate) //Put this code anywhere is your code...
请注意,我没有编译任何这些示例,我没有相应的库!
答案 2 :(得分:1)
不是直接来自Iterator
,而是可以将其转换为Sequence
。当然,通常您将拥有一个Iterable
并能够直接调用find
,依此类推,也许在这种情况下,还取决于headerRow
的类型:
headerRow.cellIterator().asSequence().
find { cell -> "IP" == formater.formatCellValue(cell) }?.
columnIndex
最后, ?.
处理find
返回null
的情况,因为没有合适的列。