我正在尝试使用成对的数组(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循环中添加值。
答案 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)
acc
是Pair<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