将数组简化为单个整数会导致类型错误

时间:2018-12-06 11:13:07

标签: android lambda kotlin type-conversion reduce

我正在尝试使用成对的数组(StartTime:Int,EndTime:Int),并将它们减少为每个会话的时间累积。

fun main() {
    val sessionsInSecond = listOf<Pair<Int,Int>>(Pair(10,12), Pair(10,15))

    val timeSpan: Int = sessionsInSecond.reduce{acc, it -> acc + (it.second - it.first) }
    println(timeSpan)
}

这给了我以下错误:

  

未解决的参考。以下候选人均不适用   由于接收器类型不匹配:@InlineOnly公共内联运算符   fun BigDecimal.plus(other:BigDecimal):在kotlin中定义的BigDecimal   @InlineOnly公共内联运算符funBigInteger.plus(other:   BigInteger):Kotlin公共运算符fun中定义的BigInteger   Array.plus(elements:Array):在中定义的数组   kotlin.collections公共运算符fun Array.plus(元素:   集合):在kotlin.collections公共中定义的数组   运算符fun Array.plus(element:Int):数组定义在   kotlin.collections公共运算符fun BooleanArray.plus(element:   Boolean):在kotlin.collections公共运算符中定义的BooleanArray   fun BooleanArray.plus(elements:BooleanArray):布尔数组定义在   kotlin.collections公共运算符fun BooleanArray.plus(elements:   集合):在kotlin.collections中定义的BooleanArray   公共运算符fun ByteArray.plus(element:Byte):定义的ByteArray   在kotlin.collections公共运算符fun ByteArray.plus(elements:   ByteArray):在kotlin.collections公共运算符中定义的ByteArray   fun ByteArray.plus(elements:Collection):字节数组定义在   kotlin.collections @InlineOnly公共内联运算符很有趣   Char.plus(other:String):在kotlin.text中定义的字符串public   运算符fun CharArray.plus(element:Char):CharArray中定义   kotlin.collections公共运算符fun CharArray.plus(elements:   CharArray):在kotlin.collections公共运算符中定义的CharArray   有趣的CharArray.plus(elements:Collection):CharArray中定义   kotlin.collections公共运算符fun DoubleArray.plus(element:   Double):在kotlin.collections公共运算符fun中定义的DoubleArray   DoubleArray.plus(elements:DoubleArray):DoubleArray在   kotlin.collections公共运算符fun DoubleArray.plus(元素:   集合):在kotlin.collections公共中定义的DoubleArray   运算符fun FloatArray.plus(element:Float):FloatArray定义于   kotlin.collections公共运算符fun FloatArray.plus(元素:   FloatArray):在kotlin.collections公共运算符中定义的FloatArray   fun FloatArray.plus(elements:Collection):定义的FloatArray   在kotlin.collections公共运算符中有趣的IntArray.plus(element:Int):   kotlin.collections中定义的IntArray公共运算符fun   IntArray.plus(elements:IntArray):定义于   kotlin.collections公共运算符fun IntArray.plus(元素:   集合):在kotlin.collections公共中定义的IntArray   运算符fun LongArray.plus(element:Long):LongArray定义于   kotlin.collections公共运算符fun LongArray.plus(elements:   LongArray):在kotlin.collections公共运算符中定义的LongArray   fun LongArray.plus(elements:Collection):在中定义的LongArray   kotlin.collections公共运算符fun ShortArray.plus(element:   缩写):在kotlin.collections公共运算符fun中定义的ShortArray   ShortArray.plus(elements:ShortArray):在中定义的ShortArray   kotlin.collections公共运算符fun ShortArray.plus(元素:   集合):在kotlin.collections公共中定义的ShortArray   运算符fun String?.plus(other:Any?):在kotlin中定义的字符串   公共运算符fun String?.plus(other:Any?):在   Kotlin公共运营商fun Collection.plus(元素:   数组):在kotlin.collections公共目录中定义的列表   运算符fun Collection.plus(elements:Iterable):   在kotlin.collections公共运算符fun中定义的列表   Collection.plus(elements:Sequence):列表定义于   kotlin.collections公共运营商的乐趣   Collection.plus(element:Int):清单中定义   kotlin.collections公共运营商的乐趣   Iterable.plus(elements:Array):清单中定义   kotlin.collections公共运营商的乐趣   Iterable.plus(elements:Iterable):清单中定义   kotlin.collections公共运营商的乐趣   Iterable.plus(elements:Sequence):清单中定义   kotlin.collections公共运算符fun Iterable.plus(element:   Int):在kotlin.collections公共运算符fun Map.plus(pairs:Array>)中定义的列表:在kotlin.collections公共运算符fun Map.plus(pair:Pair)中定义的地图:   kotlin.collections公共运算符fun Map.plus(pairs:Iterable>):定义于   kotlin.collections公共运算符fun Map.plus(map:Map):定义于   kotlin.collections公共运算符fun Map.plus(pairs:Sequence>):定义于   kotlin.collections公共运算符fun Set.plus(元素:   数组):在kotlin.collections中定义的集合public   运算符fun Set.plus(elements:Iterable):设置   在kotlin.collections中定义的公共运算符fun   Set.plus(elements:Sequence):定义于   kotlin.collections公共运算符fun Set.plus(element:   Int):在kotlin.collections中定义的集合public运算符fun   Sequence.plus(elements:Array):在中定义的序列   kotlin.sequences公共运算符fun Sequence.plus(元素:   可迭代):在kotlin.sequences public中定义的序列   运算符fun Sequence.plus(elements:Sequence):   kotlin中定义的序列.sequences公共运算符fun   Sequence.plus(element:Int):定义于   科特林序列

任何建议如何解决这个问题? ps。这是减少操作的练习,所以我不想只在forEach循环中添加值。

3 个答案:

答案 0 :(得分:2)

我想您的结果应该是Int?您可以将其更改为fold,以使其毫不费力地工作:

val timeSpan: Int = sessionsInSecond.fold(0) { acc, it -> 
    acc + (it.second - it.first) 
}

您从0开始,然后继续添加直到访问所有值。 您的代码中的问题是acc的类型为Pair<Int,Int>而不是Int

答案 1 :(得分:1)

在您的情况下,缩减中的

accPair<Int, Int>。您可以使用fold或类似的东西

    val timeSpan = sessionsInSecond.reduce { acc, it ->
        acc.first + (it.second - it.first)
        acc
    }.first

答案 2 :(得分:0)

您也可以在Pair<Int, Int>上定义扩展功能。为其提供类型别名可以使代码更具可读性。

typealias SecondsInterval = Pair<Int, Int> 

fun SecondsInterval.diff() = second - first

val timeSpan = sessionsInSecond.sumBy(SecondsInterval::diff)

如果要在其他地方检索单个SecondsInterval的差异,这将变得特别方便。

val interval: SecondsInterval = 5 to 12
interval.diff() // 7