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
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: UnsupportedErrorMaps 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 aMerke
- Funktionen: Pfeilsyntax
=>, benannte{...}und optionale[...]Parameter, Records als Mehrfachrückgabe List,Map,Setmit vielen Methoden (map,where,reduce,fold); Spread..., collectionif/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
Wie deklariert man benannte Parameter?
- In geschweiften Klammern {…} (richtig)
- In eckigen Klammern […]
- Mit @name
- Mit :name
Was ist ein Record?
- Ein unveränderlicher Verbund mehrerer Werte (Dart 3) (richtig)
- Eine Datenbanktabelle
- Eine Klasse mit Methoden
- Eine Liste
Was macht … in einer Liste?
- Spread: fügt alle Elemente einer anderen Liste ein (richtig)
- Löscht Elemente
- Kommentiert
- Sortiert
Weiter im Kurs
Zurück: Typen, Strings, Null-Sicherheit und Kontrollfluss
Weiter: Klassen, Vererbung und Mixins
Alle Kapitel: Dart im Überblick