返回匹配条件的迭代器项值

时间:2018-08-23 06:05:51

标签: kotlin

我正在解析excel文件,并且试图为“ IP”列找到索引。 下面的代码实际上将为我提供索引,但是该“ let”的返回值类型为Any。

如果数据与if语句匹配,是否有更漂亮的方法从迭代器中获取数据?

val ipColumn = headerRow.cellIterator().let {
    it.forEach { cell ->  
        if ("IP" == formater.formatCellValue(cell))
            return@let cell.columnIndex 
    }
}

3 个答案:

答案 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/2344Sequence,在这里您可以调用Sequence方法。

find()

使用val index = headerRow .asSequence() //To sequence .find { "IP" == formater.formatCellValue(it) }

如果出于某种原因您不能使用Iterator,我真的不认为有一种更漂亮的方法(当然总会有)。但是,如果您的主要问题是从List构造中获得了Any类型,则始终可以letconverting 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的情况,因为没有合适的列。