1 of 63

Tehnici avansate pentru

dezvoltarea aplicațiilor mobile

Kotlin - Colecții și funcții de ordin superior

2 of 63

Array

2

3 of 63

Array

  • O secvență de valori care au același tip de date
  • Elementele:
    • ordonate
    • accesate pe baza unui index

Kotlin - Colecții și funcții de ordin superior

3

4 of 63

Array

  • Acces aleatoriu la elemente (rapid)
    • timpul de acces e similar indiferent de element
  • Are dimensiune fixa - nu se poate extinde

Kotlin - Colecții și funcții de ordin superior

4

5 of 63

Array

  • Declarația unui Array

  • Nr total de elemente = numărul de parametri
    • este fix
  • Se poate omite tipul de date
    • inferat din tipul elementelor

Kotlin - Colecții și funcții de ordin superior

5

6 of 63

Array

  • Accesarea unui element (sintaxa subscript):

  • Setarea valorii unui element:

Kotlin - Colecții și funcții de ordin superior

6

7 of 63

Array - exemplu

  • Array nou prin unirea a 2 array-uri folosind operatorul +

Kotlin - Colecții și funcții de ordin superior

7

8 of 63

Array

  • Nu putem redimensiona un Array
    • ArrayIndexOutOfBounds
    • Trebuie creat un nou array cu o dimensiune mai mare
  • Nu este ușor să adăugăm sau să scoatem elemente dintr-un Array
    • Solutia: List

Kotlin - Colecții și funcții de ordin superior

8

9 of 63

List

9

10 of 63

List

  • O colecție ordonată și redimensionabilă
  • Implementată ca un array redimensionabil

Kotlin - Colecții și funcții de ordin superior

10

11 of 63

List

Kotlin - Colecții și funcții de ordin superior

11

12 of 63

List

  • În Kotlin List și MutableList sunt interfețe
    • MutableList extinde List
    • O clasă va oferi implementarea proprietăților și metodele

  • List reprezintă o colecție read-only de elemente
    • Nu putem adăuga sau scoate elemente

  • MutableList - putem adăuga și scoate elemente

Kotlin - Colecții și funcții de ordin superior

12

13 of 63

List

  • Funcția listOf() returnează un obiect List
    • elementele ca parametri
  • Are proprietatea size
  • 2 metode de accesare:
    • sintaxa subscript [x]
    • get(x)
  • Căutarea unui element în listă - indexOf()
    • dacă nu gasește elementul va returna -1

13

14 of 63

List - exemplu

14

15 of 63

List - parcurgerea elementelor

  • Folosim bucla for pentru a parcurge elementele din listă

Kotlin - Colecții și funcții de ordin superior

15

16 of 63

MutableList

  • Putem adăuga/modifica/șterge elemente
  • Funcția mutableListOf()
  • 2 versiuni de add()= inserare
    • 1 parametru = elementul de adăugat la sfârșitul listei
    • 2 parametri = indexul și elementul de adăugat pe acea poziție (inserat, nu înlocuit)

16

17 of 63

MutableList

  • Actualizare elemente
    • cu sintaxa subscript: array[index] = value
  • Eliminare element din listă
    • remove(element)
    • removeAt(index)
  • Verificăm dacă există un element în listă
    • contains(element)
    • operatorul in

17

18 of 63

MutableList

18

19 of 63

Set

19

20 of 63

Set

  • O colecție de elemente:
    • nu au o ordine specifică
    • nu există valori duplicate

  • Unicitatea elementelor - hashcode
    • Metoda hashCode() a oricărui obiect din Kotlin
    • Folosit pentru accesarea elementelor din Set

Kotlin - Colecții și funcții de ordin superior

20

21 of 63

Set

  • În general 2 obiecte diferite vor avea hash-uri diferite
  • 2 obiecte cu același hashcode => hash collision

  • Un Set implementat ca Array de liste
    • Hashcode-ul obiectului = index pentru Array
    • Lista de obiecte care produc acel hashcode

Kotlin - Colecții și funcții de ordin superior

21

22 of 63

Set - implementare

  • Array-ul exterior (albastru) - bucket de hashcode
  • Elementele din Set (verde)

22

23 of 63

Set

  • Căutarea unui element în Set este rapidă decât la List
    • La List apelul indexOf() verifica fiecare element în parte
    • La Set căutarea se face direct pe baza hash-ului

  • Set ocupă mai multă memorie decât List
    • Stocăm și indicii (hash-urile)

  • Pentru cantități mari de date folosim Set
    • Putem căuta mai rapid prin el

Kotlin - Colecții și funcții de ordin superior

23

24 of 63

MutableSet

  • Set este o interfață care permite accesul read-only la elemente
    • Nu putem adăuga/șterge elemente

  • MutableSet este o interfață care extinde Set
    • Putem adăuga/șterge elemente

Kotlin - Colecții și funcții de ordin superior

24

25 of 63

MutableSet

  • LinkedHashSet este o clasă care implementează MutableSet

Kotlin - Colecții și funcții de ordin superior

25

26 of 63

MutableSet

  • mutableSetOf() returnează un LinkedHashSet

  • Set-urile nu sunt ordonate
    • nu putem adăuga sau șterge de la un anumit index

  • Adăugarea aceluiași element a doua oară nu crește dimensiunea Set-ului

Kotlin - Colecții și funcții de ordin superior

26

27 of 63

MutableSet

  • size = dimensiunea Set-ului

  • add(element) = inserează un element

  • remove(element) = scoate un element

  • contains(element) = verifică dacă există un element în Set

27

28 of 63

MutableSet - exemplu

28

29 of 63

Map

29

30 of 63

Map

  • O colecție compusă din perechi cheie-valoare
  • Cheile sunt unice, valorile nu sunt unice

Kotlin - Colecții și funcții de ordin superior

30

31 of 63

Map

  • Accesarea unui element din Map este mai rapidă decât căutarea în listă cu indexOf()

  • Interfețe Map și MutableMap
    • Map - nu se poate modifica
    • MutableMap - se poate modifica

Kotlin - Colecții și funcții de ordin superior

31

32 of 63

Map

  • mapOf(), mutableMapOf()

  • Necesită 2 tipuri generice - pentru chei și valori

Kotlin - Colecții și funcții de ordin superior

32

33 of 63

Map

  • Se poate folosi type inference dacă avem valori inițiale
    • putem omite tipurile de date

Kotlin - Colecții și funcții de ordin superior

33

34 of 63

MutableMap

  • Proprietatea size = numărul de perechi cheie-valoare

  • Adăugarea sau modificarea unei perechi
    • Sintaxa subscript: map[cheie] = valoare
    • Funcția put(cheie, valoare)

Kotlin - Colecții și funcții de ordin superior

34

35 of 63

MutableMap

  • get(cheie) returnează valoarea pentru o anumită cheie
    • pentru o cheie inexistentă returnează null

  • remove(cheie) pentru ștergerea unei perechi

Kotlin - Colecții și funcții de ordin superior

35

36 of 63

MutableMap - exemplu

36

37 of 63

Colecții în Kotlin

37

38 of 63

Funcții de ordin superior pentru colecții

38

39 of 63

Funcții de ordin superior

  • Care primesc o funcție ca parametru sau care întorc o funcție

  • Funcții de ordin superior pentru colecții
    • Sortare, filtrare, grupare
    • forEach(), map(), filter(), groupBy(), fold(), sortedBy()

Kotlin - Colecții și funcții de ordin superior

39

40 of 63

forEach()

  • Execută funcția primită ca parametru pentru fiecare element din colecție

  • Primește ca parametru funcția (T) -> Unit
  • T este tipul de date al elementelor din colecție
  • Se poate omite parametrul și ne referim la parametru cu it

Kotlin - Colecții și funcții de ordin superior

40

41 of 63

forEach() - exemplu

41

42 of 63

forEach() - exemplu

  • cookies este o listă read-only de obiecte Cookie

  • Singurul parametru al funcției forEach() este expresia lambda
    • O putem muta la sfârșit și omite parantezele rotunde

  • Pentru a afișa proprietatea unui obiect în cadrul unui String template
    • ${obiect.proprietate}”

Kotlin - Colecții și funcții de ordin superior

42

43 of 63

map()

  • Transformă o colecție într-o altă colecție cu același număr de elemente
    • Poate avea tip de date diferit
    • Exemplu: din List<Int> în List<String>

43

44 of 63

map() - exemplu

  • Transformă din List<Cookie> în List<String>

44

45 of 63

filter()

  • Crează un subset al unei colecții
    • Același tip de date
    • De exemplu: colecția numerelor pare

Kotlin - Colecții și funcții de ordin superior

45

46 of 63

filter()

  • filter() primește o expresie lambda ca parametru

  • Expresia lambda primește ca parametru câte un element din colecție și returnează un Boolean:
    • true - elementul va fi inclus în noua colecție
    • false - elementul nu va fi inclus

Kotlin - Colecții și funcții de ordin superior

46

47 of 63

filter() - exemplu

Kotlin - Colecții și funcții de ordin superior

47

48 of 63

fold()

  • Generarea unei singure valori pe baza unei colecții
    • Exemplu: suma elementelor

Kotlin - Colecții și funcții de ordin superior

48

49 of 63

fold()

  • fold() are 2 parametri:
    • valoarea inițială
    • expresia lambda

  • Expresia lambda returnează o valoare cu același tip ca valoarea inițială
    • Tipul de date dedus din valoarea inițială

Kotlin - Colecții și funcții de ordin superior

49

50 of 63

fold()

  • Expresia lambda are 2 parametri:
    • Acumulatorul - unde se păstrează valoarea calculată
      • Valoarea returnată de ultima rulare a expresiei lambda
    • Elementul curent din colecție

  • Există și funcțiile reduce(), sum() și sumOf()

Kotlin - Colecții și funcții de ordin superior

50

51 of 63

fold() - exemplu

  • Valoarea inițială este 0.0 (tipul Double)
  • total = acumulatorul, cookie = elementul din colecție

Kotlin - Colecții și funcții de ordin superior

51

52 of 63

sortedBy()

  • Returnează o colecție sortată după o proprietate a obiectelor

Kotlin - Colecții și funcții de ordin superior

52

53 of 63

sortedBy()

  • Expresia lambda returnează proprietatea după care se face sortarea
    • Pret => lambda-ul returnează it.price

  • Proprietatea trebuie să permită sortarea naturală
    • String-urile, numerele pot fi sortate în mod natural

Kotlin - Colecții și funcții de ordin superior

53

54 of 63

sortedBy() - exemplu

Kotlin - Colecții și funcții de ordin superior

54

55 of 63

groupBy()

  • Poate transforma o colecție într-un Map
  • Fiecare valoare unică returnată de expresia lambda este o cheie în Map
  • Valorile pentru o anumită cheie sunt elementele din colecție care au produs acea cheie

Kotlin - Colecții și funcții de ordin superior

55

56 of 63

groupBy()

Kotlin - Colecții și funcții de ordin superior

56

57 of 63

groupBy()

  • Expresia lambda { it % 2 } returnează restul împărțirii la 2
    • cheile sunt 0 și 1
    • valorile pentru cheia 0 sunt numerele pare
    • valorile pentru cheia 1 sunt numerele impare
    • valorile sunt stocate într-un List<Int>

Kotlin - Colecții și funcții de ordin superior

57

58 of 63

groupBy() - exemplu

Kotlin - Colecții și funcții de ordin superior

58

59 of 63

Bibliografie

Kotlin - Colecții și funcții de ordin superior

59

60 of 63

Bibliografie

Kotlin - Colecții și funcții de ordin superior

60

61 of 63

Bibliografie

Kotlin - Colecții și funcții de ordin superior

61

62 of 63

Bibliografie

Kotlin - Colecții și funcții de ordin superior

62

63 of 63

Cuvinte cheie

  • Array
  • List, MutableList
  • Set, MutableSet
  • Map, MutableMap
  • Funcții de ordin superior
  • forEach()
  • map()
  • filter()
  • fold()
  • sortedBy()
  • groupBy()

Kotlin - Colecții și funcții de ordin superior

63

63