#kotlin #functional-programming
#kotlin #функциональное программирование
Вопрос:
Допустим, у меня есть классы:
class SomeClass(
val name: String
)
data class MyClass (
val setValues: Set<SomeClass>,
val intValue: Int
)
Затем я создаю набор следующим образом:
val someClass1 = SomeClass("a")
val someClass2 = SomeClass("b")
val someClass3 = SomeClass("c")
val someClass4 = SomeClass("d")
val someClass5 = SomeClass("e")
val someClass6 = SomeClass("f")
val val1 = MyClass(setOf(someClass1, someClass2, someClass3), 1)
val val2 = MyClass(setOf(someClass1, someClass4, someClass5), 2)
val val3 = MyClass(setOf(someClass4, someClass5, someClass6), 3)
val setOfMyClass = setOf(val1, val2, val3)
и я хочу выполнить некоторые операции с этим набором setOfMyClass
, например
val result = set. ...
и в результате получаем сопоставление следующим образом:
someClass1 to 1
someClass2 to 1
someClass3 to 1
someClass1 to 2
someClass4 to 2
someClass5 to 2
someClass4 to 3
someClass5 to 3
someClass6 to 3
вероятно, это должен быть какой-то список.
Ответ №1:
У вас есть a Set<MyClass>
, каждый из которых содержит a Set<SomeClass>
. Обычно решением является сопоставление коллекции коллекций в одну коллекцию flatMap
. В вашем примере объединение flatMap
во внешнем наборе и map
во внутреннем наборе дает вам список сопоставленных пар.
Это дает вам List<Pair<SomeClass, Int>>
— что, вероятно, то, что вы хотите?
val result = setOfMyClass.flatMap { myObject ->
myObject.setValues.map { it to myObject.intValue }
}
Или, если вы хотите, чтобы это было как a Map<SomeClass, Int>
, просто сделайте то же самое, что и выше, и:
result.toMap()
Ответ №2:
Если я понимаю ваш вопрос, решением будет: setValues.AssociateWith { intValue }, который вернет Map<SomeClass, Int>
Комментарии:
1. Я начинаю с a
Set<MyClass>
и хочу сделать это для всех наборов (setValues) из этого основного набора.
Ответ №3:
Я не уверен, понял ли я ваш вопрос, но я попробую.
Допустим, SomeClass был Int, и вы хотите вычислить intValue x для каждого элемента x из setValues.
В этом случае вы бы выполнили и получили список результатов. myClassObject.setValues.map{Pair(it, myClassObject.intValue)}
Результатом является список, а не набор, потому что некоторые результаты могут появляться несколько раз (поскольку отображение не обязательно должно быть инъективным), и множество элементов теряется в наборе.