Обзор API коллекций Kotlin

Обзор 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.