Обзор API коллекций Kotlin
1. обзор
В этом кратком руководстве мы познакомим вас с API коллекций Kotlin и обсудим различные типы коллекций в Kotlin и некоторые общие операции с коллекциями.
2. Коллекция против Мутабельная коллекция
Во-первых, давайте рассмотрим различные типы коллекций в Котлине. Мы увидим, как инициализировать базовые типы коллекций.
ИнтерфейсCollection поддерживает методы только для чтения, аMutableCollection поддерживает методы чтения / записи.
2.1. Listс
Мы можем создать простой доступный только для чтенияList, используя методlistOf(), и чтение-записьMutableList, используяmutableListOf():
val theList = listOf("one", "two", "three")
val theMutableList = mutableListOf("one", "two", "three")
2.2. Setс
Точно так же мы можем создать доступный только для чтенияSet с помощью методаsetOf() и чтение-записьMutableSet с помощьюmutableSetOf():
val theSet = setOf("one", "two", "three")
val theMutableSet = mutableSetOf("one", "two", "three")
2.3. Mapс
Мы также можем создать доступный только для чтенияMap, используя методmapOf(), и чтение-записьMutableMap, используяmutableMapOf():
val theMap = mapOf(1 to "one", 2 to "two", 3 to "three")
val theMutableMap = mutableMapOf(1 to "one", 2 to "two", 3 to "three")
3. Полезные операторы
Kotlin Collections API намного богаче того, что мы можем найти в Java - он поставляется с набором перегруженных операторов.
3.1. Оператор «in”»
Мы можем использовать выражение «x in collection», которое можно перевести вcollection.contains(x):
@Test
fun whenSearchForExistingItem_thenFound () {
val theList = listOf("one", "two", "three")
assertTrue("two" in theList)
}
3.2. Оператор“+”
Мы можем передать элемент или всю коллекцию другому, используя оператор «+»:
@Test
fun whenJoinTwoCollections_thenSuccess () {
val firstList = listOf("one", "two", "three")
val secondList = listOf("four", "five", "six")
val resultList = firstList + secondList
assertEquals(6, resultList.size)
assertTrue(resultList.contains("two"))
assertTrue(resultList.contains("five"))
}
3.3. Оператор“-“
Точно так же мы можем удалить элемент или несколько элементов, используя оператор «-»:
@Test
fun whenExcludeItems_thenRemoved () {
val firstList = listOf("one", "two", "three")
val secondList = listOf("one", "three")
val resultList = firstList - secondList
assertEquals(1, resultList.size)
assertTrue(resultList.contains("two"))
}
4. Другие Методы
Наконец, мы рассмотрим некоторые распространенные методы сбора. В Java, если мы хотим использовать расширенные методы, нам нужно будет использовать APIStream.
В Kotlin мы можем найти похожие методы, доступные в API Коллекций.
Мы можем получить подсписок из заданногоList:
@Test
fun whenSliceCollection_thenSuccess () {
val theList = listOf("one", "two", "three")
val resultList = theList.slice(1..2)
assertEquals(2, resultList.size)
assertTrue(resultList.contains("two"))
}
Мы можем легко удалить все нули изList:
@Test
fun whenFilterNullValues_thenSuccess () {
val theList = listOf("one", null, "two", null, "three")
val resultList = theList.filterNotNull()
assertEquals(3, resultList.size)
}
Мы можем легко фильтровать элементы коллекции, используя фильтр(),, который работает аналогично методуfilter() из API JavaStream:
@Test
fun whenFilterNonPositiveValues_thenSuccess () {
val theList = listOf(1, 2, -3, -4, 5, -6)
val resultList = theList.filter{ it > 0}
assertEquals(3, resultList.size)
assertTrue(resultList.contains(1))
assertFalse(resultList.contains(-4))
}
Мы можем сбросить первые N предметов:
@Test
fun whenDropFirstItems_thenRemoved () {
val theList = listOf("one", "two", "three", "four")
val resultList = theList.drop(2)
assertEquals(2, resultList.size)
assertFalse(resultList.contains("one"))
assertFalse(resultList.contains("two"))
}
Мы можем отбросить предметы первыми несколькими предметами, если они удовлетворяют заданному условию:
@Test
fun whenDropFirstItemsBasedOnCondition_thenRemoved () {
val theList = listOf("one", "two", "three", "four")
val resultList = theList.dropWhile{ it.length < 4 }
assertEquals(2, resultList.size)
assertFalse(resultList.contains("one"))
assertFalse(resultList.contains("two"))
}
Мы можем группировать элементы:
@Test
fun whenGroupItems_thenSuccess () {
val theList = listOf(1, 2, 3, 4, 5, 6)
val resultMap = theList.groupBy{ it % 3}
assertEquals(3, resultMap.size)
assertTrue(resultMap[1]!!.contains(1))
assertTrue(resultMap[2]!!.contains(5))
}
Мы можем отобразить все элементы, используя предоставленную функцию:
@Test
fun whenApplyFunctionToAllItems_thenSuccess () {
val theList = listOf(1, 2, 3, 4, 5, 6)
val resultList = theList.map{ it * it }
assertEquals(4, resultList[1])
assertEquals(9, resultList[2])
}
Мы можем использоватьflatmap() для сглаживания вложенных коллекций. Здесь мы конвертируемStrings в List<String> и не получаемList<List<String>>:
@Test
fun whenApplyMultiOutputFunctionToAllItems_thenSuccess () {
val theList = listOf("John", "Tom")
val resultList = theList.flatMap{ it.toLowerCase().toList() }
assertEquals(7, resultList.size)
}
Мы можем выполнить операциюfold/reduce:
@Test
fun whenApplyFunctionToAllItemsWithStartingValue_thenSuccess () {
val theList = listOf(1, 2, 3, 4, 5, 6)
val finalResult = theList.fold(0, {acc, i -> acc + (i * i)})
assertEquals(91, finalResult)
}
5. Заключение
Мы изучили API коллекций Kotlin и некоторые из наиболее интересных методов.
И, как всегда, полный исходный код можно найтиover on GitHub.