1 of 65

Tehnici avansate pentru

dezvoltarea aplicațiilor mobile

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

2 of 65

Array

2

3 of 65

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 65

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 65

Array

  • Declarația unui Array

  • Numărul de parametri => nr total de elemente
    • este fix
  • Se poate omite tipul de date
    • inferat din tipul elementelor

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

5

6 of 65

Array

  • Accesarea unui element (sintaxa subscript):

  • Setarea valorii unui element:

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

6

7 of 65

Array - exemplu

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

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

7

8 of 65

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 65

List

9

10 of 65

List

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

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

10

11 of 65

List

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

11

12 of 65

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 65

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 65

List - exemplu

14

15 of 65

List - parcurgerea elementelor

  • Folosim bucla for pentru a parcurge elementele din listă

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

15

16 of 65

MutableList

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

16

17 of 65

MutableList

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

17

18 of 65

MutableList

18

19 of 65

Set

19

20 of 65

Set

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

  • Set - nu permite adăugarea/ștergerea elementelor
  • MutableSet - permite adăugarea/ștergerea elementelor

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

20

21 of 65

Set

  • Unicitatea elementelor
    • hashcode = identificator obiect
    • obiectele din Kotlin au metoda hashCode()
    • folosit pentru accesarea elementelor din Set

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

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

21

22 of 65

Set

  • 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

22

23 of 65

Set - implementare

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

23

24 of 65

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

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

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

24

25 of 65

MutableSet

  • Set - interfață ce permite acces 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

25

26 of 65

MutableSet

  • LinkedHashSet = clasă care implementează MutableSet

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

26

27 of 65

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

27

28 of 65

MutableSet

  • size = dimensiunea Set-ului

  • add(element) = inserează un element

  • remove(element) = scoate un element

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

28

29 of 65

MutableSet - exemplu

29

30 of 65

Map

30

31 of 65

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

31

32 of 65

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

32

33 of 65

Map

  • mapOf(), mutableMapOf()

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

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

33

34 of 65

Map

  • Se pot infera tipurile de date dacă avem valori inițiale
    • putem omite tipurile de date

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

34

35 of 65

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

35

36 of 65

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

36

37 of 65

MutableMap - exemplu

37

38 of 65

Colecții în Kotlin

38

39 of 65

Funcții de ordin superior pentru colecții

39

40 of 65

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

40

41 of 65

forEach()

  • Pentru fiecare element din colecție => execută o funcție

  • Primește ca parametru funcția (T) -> Unit
    • T este tipul de date al elementelor din colecție
    • expresie lambda => trailing lambda

  • Se poate omite parametrul și ne referim la parametru cu it

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

41

42 of 65

forEach() - exemplu

42

43 of 65

forEach() - exemplu

  • cookies este o listă immutable de obiecte Cookie

  • Parametrul funcției forEach() este expresia lambda
    • => trailing lambda

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

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

43

44 of 65

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>

44

45 of 65

map() - exemplu

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

45

46 of 65

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

46

47 of 65

filter()

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

  • Expresia lambda
    • primește ca parametru câte un element din colecție
    • 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

47

48 of 65

filter() - exemplu

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

48

49 of 65

fold()

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

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

49

50 of 65

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

50

51 of 65

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

51

52 of 65

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

52

53 of 65

sort()

  • Sortează elementele unei colecții
  • Tipuri de de date de bază - sortare naturală

53

54 of 65

sortedBy()

  • Pentru tipuri de date complexe
  • Sortează după o proprietate a obiectelor
  • Returnează o colecție sortată

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

54

55 of 65

sortedBy()

  • Expresia lambda trebuie să returneze proprietatea după care se face sortarea
    • Preț => 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

55

56 of 65

sortedBy() - exemplu

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

56

57 of 65

groupBy()

  • Transformă o colecție într-un Map
    • Cheie = valoare unică returnată de expresia lambda
    • Valori = elementele din colecție care au produs acea cheie

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

57

58 of 65

groupBy()

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

58

59 of 65

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

59

60 of 65

groupBy() - exemplu

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

60

61 of 65

Bibliografie

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

61

62 of 65

Bibliografie

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

62

63 of 65

Bibliografie

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

63

64 of 65

Bibliografie

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

64

65 of 65

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

65

65