Я намеревался обработать некоторые данные (это список, проанализированный из json объектов Nuu
, в приведенном ниже примере я только что оформил список). Чтобы обработать эту коллекцию, я передаю потребителю println
в метод getAllNuu
, который извлекает и анализирует это "json".
Хотя данные, которые я получаю от json, содержат дубликаты (на основе на двух [Nuu.lo
, Nuu.la
] из трех полей (см. переопределено Nuu.equals
- генерируется), поэтому я хотел бы объединить их, используя функцию расширения Nuu.merge
Я не увидеть любую ошибку, пока я не попытаюсь скомпилировать код ниже, а затем я получаю: Error:(7, 5) Kotlin: Type mismatch: inferred type is Collection<Nuu?> but Collection<Nuu> was expected
Почему kotlin выводит коллекцию с обнуляемыми объектами? Где это происходит?
Буду также признателен за любые предложения по улучшению или повышению качества кода kotlin.
Моя среда: kotlinc -jvm 1.3.70 (JRE 12.0.1 + 12)
Код:
fun main(args: Array<String>) {
getAllNuu { data -> println(mergeNuus(data)) }
}
fun mergeNuus(data: Collection<Nuu>): Collection<Nuu> =
// grouping two same (based on their equals) elements
data.groupingBy { it }
// ^ Error:(7, 5) Kotlin: Type mismatch: inferred type is Collection<Nuu?> but Collection<Nuu> was expected
// merging the equal elemnts into one
.aggregate { _, accumulator: Nuu?, element: Nuu, first ->
if (first)
element
else
accumulator!!.merge(element)
}.values
// supposedly this is a http request which processes
// the retrieved data by passed in consumer 'printout'
fun getAllNuu(printout: (data: Collection<Nuu>) -> Unit) {
val nuuList = listOf(
Nuu(3, "t", 1),
Nuu(5, "6", 2), // say this is a http request
Nuu(7, "a", 3), // just been stubbed with the list
Nuu(3, "a", 4),
Nuu(5, "5", 5),
Nuu(2, "2", 6),
Nuu(3, "t", 7),
Nuu(1, "1", 8),
Nuu(5, "5", 9),
Nuu(2, "2", 10)
)
// processing the data with consumer passed
// from the main method
printout.invoke(nuuList)
}
data class Nuu(
val lo: Int,
val la: String,
val su: Int
) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as Nuu
if (lo != other.lo) return false
if (la != other.la) return false
return true
}
override fun hashCode(): Int {
var result = lo
result = 31 * result + la.hashCode()
return result
}
}
// similarity based on equals, and sumup the field 'su'
fun Nuu.merge(other: Nuu) = Nuu(lo, la, su + other.su)
Спасибо