EMZETT.
Login

Kurz: String gruss(String name, {String anrede = ‘Hallo’, int? alter}) { // benannte Parameter var text = ‘anrede, name!’; if (alter != null) text += ’ ($alter)’; return text; }

Teil des Kurses Dart

Kapitel 3 von 8 im Kurs Dart (Abschnitt „Daten“). Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Funktionen

int addiere(int a, int b) => a + b;                 // Pfeilsyntax für Einzeiler
 
String gruss(String name, {String anrede = 'Hallo', int? alter}) {      // benannte Parameter
  var text = '$anrede, $name!';
  if (alter != null) text += ' ($alter)';
  return text;
}
 
int summe(List<int> zahlen, [int start = 0]) {       // optionale Positionsparameter
  var s = start;
  for (final z in zahlen) { s += z; }
  return s;
}
 
(int, int) minMax(List<int> liste) {                 // Record als Rückgabe (Dart 3)
  return (liste.reduce((a, b) => a < b ? a : b), liste.reduce((a, b) => a > b ? a : b));
}
 
int fakultaet(int n) => n <= 1 ? 1 : n * fakultaet(n - 1);
 
Function(int) addierer(int n) => (x) => x + n;       // Closure als Rückgabewert
 
void main() {
  print(addiere(2, 3));
  print(gruss('Mia'));
  print(gruss('Tom', anrede: 'Hi', alter: 25));
  print(summe([1, 2, 3]));
  print(summe([1, 2, 3], 10));
  final (kleinster, groesster) = minMax([4, 9, 1, 7]);
  print('$kleinster $groesster');
  print(fakultaet(10));
  var plus5 = addierer(5);
  print(plus5(10));
 
  var verdopple = (int x) => x * 2;                  // anonyme Funktion
  print([1, 2, 3].map(verdopple).toList());
  print([1, 2, 3].map((e) => e * e).toList());
}

Ausgabe:

5
Hallo, Mia!
Hi, Tom! (25)
6
16
1 9
3628800
15
[2, 4, 6]
[1, 4, 9]

Listen

void main() {
  var f = ['Apfel', 'Birne', 'Kirsche'];
  f.add('Dattel');
  f.insert(0, 'Ananas');
  f.remove('Birne');
  print('$f ${f.length} ${f.first} ${f.last} ${f[1]} ${f.indexOf('Kirsche')}');
  print('${f.contains('Apfel')} ${f.sublist(1, 3)} ${f.reversed.toList()} ${f.join(', ')}');
  var z = [5, 3, 9, 1, 7];
  z.sort();
  print(z);
  z.sort((a, b) => b.compareTo(a));
  print(z);
  print('${z.reduce((a, b) => a + b)} ${z.fold(0, (s, x) => s + x)} ${z.where((x) => x > 4).toList()}');
  print('${z.map((x) => x * 2).toList()} ${z.any((x) => x > 8)} ${z.every((x) => x > 0)}');
  print('${z.take(2).toList()} ${z.skip(3).toList()} ${z.firstWhere((x) => x < 6)} ${z.indexWhere((x) => x == 3)}');
  var mehr = [...z, 100];                             // Spread-Operator
  var bedingt = [1, if (z.isNotEmpty) 2, for (var i in [3, 4]) i * 10];   // collection if/for
  print('$mehr $bedingt');
  var matrix = [[1, 2], [3, 4]];
  print('${matrix[1][0]} ${matrix.expand((r) => r).toList()}');
  var festeListe = List<int>.filled(3, 0);
  var generiert = List.generate(5, (i) => i * i);
  print('$festeListe $generiert');
  var unveraenderlich = List.unmodifiable([1, 2, 3]);
  try { unveraenderlich.add(4); } catch (e) { print('Fehler: ${e.runtimeType}'); }
}

Ausgabe:

[Ananas, Apfel, Kirsche, Dattel] 4 Ananas Dattel Apfel 2
true [Apfel, Kirsche] [Dattel, Kirsche, Apfel, Ananas] Ananas, Apfel, Kirsche, Dattel
[1, 3, 5, 7, 9]
[9, 7, 5, 3, 1]
25 25 [9, 7, 5]
[18, 14, 10, 6, 2] true true
[9, 7] [3, 1] 5 3
[9, 7, 5, 3, 1, 100] [1, 2, 30, 40]
3 [1, 2, 3, 4]
[0, 0, 0] [0, 1, 4, 9, 16]
Fehler: UnsupportedError

Maps und Sets

void main() {
  var alter = {'Mia': 17, 'Tom': 25};
  alter['Zoe'] = 31;
  alter.putIfAbsent('Ben', () => 9);
  alter.remove('Tom');
  print('${alter['Mia']} ${alter['Nix']} ${alter.length} ${alter.containsKey('Zoe')}');
  alter.forEach((k, v) => print('$k => $v'));          // Einfügereihenfolge bleibt erhalten
  print('${alter.keys.toList()} ${alter.values.toList()}');
  print(alter.map((k, v) => MapEntry(k.toUpperCase(), v + 1)));
  print(Map.fromEntries(alter.entries.where((e) => e.value > 10)));
 
  var zaehler = <String, int>{};
  for (final w in 'a b a c a b'.split(' ')) {
    zaehler[w] = (zaehler[w] ?? 0) + 1;
  }
  print(zaehler);
  var sortiert = zaehler.entries.toList()..sort((a, b) => b.value.compareTo(a.value));
  print(sortiert.map((e) => '${e.key}:${e.value}').join(' '));
 
  var s = {3, 1, 2, 3, 1};
  s.add(9);
  print('${s.length} ${s.contains(2)} ${s.union({10})} ${s.intersection({1, 9, 7})} ${s.difference({1})}');
}

Ausgabe:

17 null 3 true
Mia => 17
Zoe => 31
Ben => 9
[Mia, Zoe, Ben] [17, 31, 9]
{MIA: 18, ZOE: 32, BEN: 10}
{Mia: 17, Zoe: 31}
{a: 3, b: 2, c: 1}
a:3 b:2 c:1
4 true {3, 1, 2, 9, 10} {1, 9} {3, 2, 9}

Records und Muster (Dart 3)

void main() {
  var person = (name: 'Mia', alter: 17);            // benannter Record
  var punkt = (3, 4);                               // positioneller Record
  print('${person.name} ${person.alter} ${punkt.$1} ${punkt.$2}');
  var (x, y) = punkt;
  var (:name, :alter) = person;
  print('$x $y $name $alter');
 
  List<int> wert = [1, 2, 3];
  switch (wert) {
    case [var a, var b, var c]:
      print('Liste mit drei Elementen: ${a + b + c}');
    case [var a] when a > 10:
      print('ein großes Element');
    default:
      print('anderes');
  }
  var json = {'name': 'Tom', 'tags': ['a', 'b']};
  if (json case {'name': String n, 'tags': [var erstes, ...]}) {
    print('$n $erstes');
  }
}

Ausgabe:

Mia 17 3 4
3 4 Mia 17
Liste mit drei Elementen: 6
Tom a

Merke

  • Funktionen: Pfeilsyntax =>, benannte {...} und optionale [...] Parameter, Records als Mehrfachrückgabe
  • List, Map, Set mit vielen Methoden (map, where, reduce, fold); Spread ..., collection if/for
  • Maps behalten die Einfügereihenfolge
  • Records und Muster (Dart 3) zerlegen Daten elegant

Übungsaufgabe

Zähle die Wörter eines Satzes mit einer Map und gib sie nach Häufigkeit sortiert aus.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Typen, Strings, Null-Sicherheit und Kontrollfluss

Weiter: Klassen, Vererbung und Mixins

Alle Kapitel: Dart im Überblick