↑↓ seç · Enter aç · Esc kapat

Mutlu Tekin
Mutlu Tekin
← Yazılar

Bölüm 5 — Konu 23: Arrow Function (`=>`) Sözdizimi

3 dk okuma #dart
Dizi · 22/64 Dart Türkçe Tutorial
  1. Bölüm 1 — Konu 1: Dart Nedir, Nerede Kullanılır, Neden Flutter Bu Dili Seçti
  2. Bölüm 1 — Konu 2: Ortam Kurulumu (Dart SDK, DartPad, Terminal ile Çalıştırma)
  3. Bölüm 1 — Konu 3: İlk Program (`main()`, `print()`, Dosya Yapısı)
  4. Bölüm 1 — Konu 4: Yorum Satırları, Temel Sözdizimi Kuralları
  5. Bölüm 2 — Konu 5: Değişken Tanımlama — `var`, `final`, `const` Farkı
  6. Bölüm 2 — Konu 6: Temel Tipler — `int`, `double`, `String`, `bool`
  7. Bölüm 2 — Konu 7: Tip Çıkarımı (Type Inference) ve Açık Tip Belirtme
  8. Bölüm 2 — Konu 8: `dynamic` ve `Object` — Ne Zaman Kullanılır, Ne Zaman Kaçınılır
  9. Bölüm 2 — Konu 9: Null Safety Temelleri (`?`, `!`, `late`'e Giriş)
  10. Bölüm 3 — Konu 10: Aritmetik, Atama, Karşılaştırma, Mantıksal Operatörler
  11. Bölüm 3 — Konu 11: `if / else if / else`
  12. Bölüm 3 — Konu 12: `switch` / `switch expression` (Modern Dart)
  13. Bölüm 3 — Konu 13: Ternary Operatör, `??`, `??=`, `?.`
  14. Bölüm 3 — Konu 14: `for`, `while`, `do-while` Döngüleri
  15. Bölüm 4 — Konu 16: `List` — Oluşturma, Erişim, Temel Metodlar
  16. Bölüm 4 — Konu 17: `Set` — Benzersiz Eleman Mantığı
  17. Bölüm 4 — Konu 18: `Map` — Key-Value Yapılar
  18. Bölüm 4 — Konu 19: Koleksiyon Üzerinde `for-in`, `forEach`
  19. Bölüm 4 — Konu 20: Spread Operatörü (`...`, `...?`) ve Collection If/For
  20. Bölüm 5 — Konu 21: Fonksiyon Tanımlama, Parametreler (Positional, Named, Optional)
  21. Bölüm 5 — Konu 22: Varsayılan Parametre Değerleri (Derinlemesine)
  22. Bölüm 5 — Konu 23: Arrow Function (`=>`) Sözdizimi
  23. Bölüm 5 — Konu 24: Fonksiyonlar Birinci Sınıf Vatandaş — Değişkene Atama, Parametre Olarak Geçme
  24. Bölüm 5 — Konu 25: Anonim Fonksiyonlar ve Closure Kavramı (Derinlemesine)
  25. Bölüm 5 — Konu 26: Recursion (Özyineleme)
  26. Bölüm 6 — Konu 27: Class Tanımlama, Constructor (Varsayılan, Named, Factory)
  27. Bölüm 6 — Konu 28: Alanlar (Fields), Metodlar, `this` Kullanımı (Derinlemesine)
  28. Bölüm 6 — Konu 29: Initializer List, Constructor Kısayolları (Derinlemesine)
  29. Bölüm 6 — Konu 30: Getter / Setter
  30. Bölüm 6 — Konu 31: Statik Üyeler (`static`)
  31. Bölüm 7 — Konu 32: Kalıtım (`extends`), `super` Kullanımı
  32. Bölüm 7 — Konu 33: Metod Override Etme, `@override`
  33. Bölüm 7 — Konu 34: Soyut Sınıflar (`abstract class`)
  34. Bölüm 7 — Konu 35: Interface Mantığı (`implements`)
  35. Bölüm 7 — Konu 36: Mixin (`with`)
  36. Bölüm 7 — Konu 37: `enum` — Basit ve Gelişmiş (Metotlu Enum'lar)
  37. Bölüm 8 — Konu 38: `try / catch / finally`, `throw`
  38. Bölüm 8 — Konu 39: Özel Exception Sınıfları Yazma
  39. Bölüm 8 — Konu 40: Sound Null Safety Derinlemesine — `late`, `required`, Non-Nullable Varsayılan Davranış
  40. Bölüm 8 — Konu 41: `assert` ile Geliştirme Zamanı Kontrolleri
  41. Bölüm 9 — Konu 42: Generic Sınıflar ve Fonksiyonlar
  42. Bölüm 9 — Konu 43: Generic Sınırlamalar (`<T extends ...>`)
  43. Bölüm 9 — Konu 44: Dart'ın Built-in Generic Koleksiyonları Nasıl Çalışır
  44. Bölüm 10 — Konu 45: `Future` Kavramı, `async`/`await`
  45. Bölüm 10 — Konu 46: `Future.then`, Hata Yönetimi (`catchError`)
  46. Bölüm 10 — Konu 47: `Stream` Temelleri, `async*`, `yield`
  47. Bölüm 10 — Konu 48: `StreamController`, Broadcast Stream
  48. Bölüm 11 — Konu 49: `map`, `where`, `reduce`, `fold`
  49. Bölüm 11 — Konu 50: `sort`, Custom Comparator ile Sıralama
  50. Bölüm 11 — Konu 51: Iterable Kavramı Derinlemesine (Lazy Evaluation)
  51. Bölüm 11 — Konu 52: Cascade Notasyonu (`..`)
  52. Bölüm 12 — Konu 53: `pubspec.yaml`, pub.dev'den Paket Ekleme
  53. Bölüm 12 — Konu 54: Kütüphane Oluşturma, `import`/`export`, `part`/`part of`
  54. Bölüm 12 — Konu 55: Dart'ta Test Yazımı (`test` Paketi, Unit Test Mantığı)
  55. Bölüm 12 — Konu 56: Extension Methods
  56. Bölüm 12 — Konu 57: Dart'ın Derleme Modelleri (JIT vs AOT) ve Bunun Flutter'a Etkisi
  57. Bölüm 13 — Konu 59: Dart 3 Pattern Matching — Records, Destructuring, Sealed Classes, Exhaustive Switch
  58. Bölüm 13 — Konu 60: `Never` Tipi, `covariant` ve Generic Variance Detayları
  59. Bölüm 13 — Konu 61: Event Loop Derinlemesine — Microtask Queue vs Event Queue
  60. Bölüm 13 — Konu 62: Memory Model & Performans — Garbage Collection, `const` Nesnelerin Bellek Avantajı
  61. Bölüm 13 — Konu 63: Isolate'ler Arası Mesajlaşmanın Maliyeti ve `compute()`'un İç İşleyişi
  62. Bölüm 13 — Konu 64: FFI (Foreign Function Interface) — C Koduna Erişim
  63. Bölüm 13 — Konu 65: Sunucu Tarafında Dart — `dart:io`, `shelf` Paketiyle Basit Bir Backend/CLI Aracı Yazma
  64. Bölüm 13 — Konu 66: Derleyici & Analiz Araçları — `dart analyze`, Custom Lint Kuralları, `build_runner` Mimarisi
Dizinin sayfası →
İçindekiler 9 başlık
  1. Arrow Function Nedir?
  2. Ne Zaman Kullanılabilir, Ne Zaman Kullanılamaz?
  3. void Fonksiyonlarda Arrow Kullanımı
  4. Koşullu İfadelerle Arrow Function — Ternary ile Birleştirme
  5. Getter'larda Arrow Function — Küçük Bir Önizleme
  6. Neden Bu Kadar Yaygın Kullanılır?
  7. Klasik Yazım ile Arrow Yazımı — Ne Zaman Hangisi?
  8. 🎯 Bu Dersten Çıkarılması Gerekenler
  9. 📝 Ödevler

Arrow Function Nedir?

Bir fonksiyonun gövdesi tek bir ifadeden oluşuyorsa (tek bir değer hesaplayıp döndürüyorsa), Dart bunu çok daha kısa yazmana izin veren bir sözdizimi sunar: arrow function (=>).

dart
// Klasik yazım
int kare(int sayi) {
  return sayi * sayi;
}

// Arrow function ile
int kareKisa(int sayi) => sayi * sayi;

void main() {
  print(kare(5));      // 25
  print(kareKisa(5));  // 25 — aynı sonuç
}

Sözdizimi: dönüşTipi fonksiyonAdı(parametreler) => ifade;

Dikkat et — return kelimesi ve süslü parantezler yoktur. => işaretinden sonraki ifadenin sonucu, otomatik olarak fonksiyonun dönüş değeri olur. Sonunda yine noktalı virgül (;) gerekir.

Ne Zaman Kullanılabilir, Ne Zaman Kullanılamaz?

Kullanılabilir — gövde tek bir ifadeyse:

dart
bool cift(int sayi) => sayi % 2 == 0;
String selamla(String isim) => "Merhaba, $isim!";
double alan(double genislik, double yukseklik) => genislik * yukseklik;

Kullanılamaz — gövde birden fazla ifade/işlem içeriyorsa:

dart
// ❌ Bu arrow function ile YAZILAMAZ (birden fazla ifade var)
int hesapla(int a, int b) {
  int toplam = a + b;
  int carpim = a * b;
  return toplam + carpim;
}

Arrow function, sadece tek bir ifadenin sonucunu doğrudan döndürmek için tasarlanmıştır. Eğer ara değişkenler tanımlaman, koşullu mantık çalıştırman veya birden fazla adım gerekiyorsa, klasik { } yazımına dönmen gerekir.

void Fonksiyonlarda Arrow Kullanımı

Arrow function, sadece değer döndüren fonksiyonlarla sınırlı değildir — bir işlemi (yan etki) tek satırda yapan void fonksiyonlarda da kullanılabilir:

dart
void selamVer(String isim) => print("Merhaba, $isim!");

void main() {
  selamVer("Elif"); // Merhaba, Elif!
}

Burada print() çağrısının sonucu (aslında void) otomatik olarak fonksiyonun kendisinin de void dönüş tipine uyar.

Koşullu İfadelerle Arrow Function — Ternary ile Birleştirme

Bölüm 3'te öğrendiğimiz ternary operatörünü hatırlarsan, arrow function ile birlikte tek satırda koşullu mantık da yazabilirsin:

dart
String durumBelirle(int yas) => yas >= 18 ? "Yetişkin" : "Çocuk";

void main() {
  print(durumBelirle(20)); // Yetişkin
  print(durumBelirle(10)); // Çocuk
}

Ya da Bölüm 3'te gördüğümüz switch expression ile:

dart
String harfNotu(int puan) => switch (puan) {
  >= 90 => "AA",
  >= 80 => "BA",
  >= 70 => "BB",
  _ => "FF",
};

Bu, önceki bölümlerde öğrendiğin özelliklerin (ternary, switch expression) arrow function ile nasıl birleştiğini gösteriyor — Dart'ın modern sözdizimi, bu parçaları bir araya getirdiğinde çok güçlü ve kısa ifadeler kurmana izin veriyor.

Getter'larda Arrow Function — Küçük Bir Önizleme

Bölüm 6'da sınıflar konusunda "getter" kavramını detaylı işleyeceğiz, ama arrow function'ın orada da sıkça kullanıldığını bilmen faydalı:

dart
class Dikdortgen {
  double genislik;
  double yukseklik;

  Dikdortgen(this.genislik, this.yukseklik);

  double get alan => genislik * yukseklik; // arrow ile kısa getter
}

Neden Bu Kadar Yaygın Kullanılır?

Arrow function, Dart/Flutter kodunda inanılmaz derecede yaygındır çünkü:

  1. Kısalık — tek satırlık basit mantıklar için gereksiz görsel gürültüyü (süslü parantez, return) ortadan kaldırır.
  2. Fonksiyonel programlama stiline uygunluk — Bölüm 11'de göreceğimiz map, where, reduce gibi metodlara anonim fonksiyon (isimsiz fonksiyon) geçerken sürekli kullanılır:
dart
void main() {
  List<int> sayilar = [1, 2, 3, 4, 5];

  // where metoduna arrow function ile kısa bir fonksiyon geçiriyoruz
  List<int> ciftler = sayilar.where((sayi) => sayi % 2 == 0).toList();
  print(ciftler); // [2, 4]
}

Bu örnek, Bölüm 11'de detaylı işleyeceğimiz .where() metoduna bir önizleme — ama arrow function'ın parametre olarak geçilen fonksiyonlarda ne kadar doğal ve sık kullanıldığını göstermesi açısından önemli.

  1. Flutter'da widget build metodlarında — basit widget'lar döndüren fonksiyonlarda sürekli göreceksin:
dart
// Flutter'a ileride göreceğin bir örnek (şimdilik sadece sözdizimine bak)
Widget build(BuildContext context) => Text("Merhaba");

Klasik Yazım ile Arrow Yazımı — Ne Zaman Hangisi?

Pratik kural: Fonksiyonun gövdesi tek bir return ifadesinden ibaretse, arrow function kullan — daha temiz olur. Birden fazla adım, ara değişken veya koşullu blok (if/else blokları, döngüler) içeriyorsa, klasik { } yazımını kullan.

dart
// ✅ Arrow uygun — tek ifade
int ikiyleCarp(int x) => x * 2;

// ✅ Klasik uygun — birden fazla adım var
int karmasikHesap(int x) {
  int adim1 = x * 2;
  int adim2 = adim1 + 10;
  if (adim2 > 100) {
    return 100;
  }
  return adim2;
}

🎯 Bu Dersten Çıkarılması Gerekenler

  • Arrow function (=>), tek ifadelik fonksiyonları kısaltmak için kullanılır; return ve { } gerekmez.
  • Sadece tek bir ifade içeren fonksiyonlarda kullanılabilir — birden fazla adım gerekiyorsa klasik yazım şart.
  • void fonksiyonlarda da kullanılabilir (bir yan etkiyi tek satırda çalıştırmak için).
  • Ternary ve switch expression ile birleştirilerek tek satırda koşullu mantık kurulabilir.
  • Fonksiyonel programlama stilinde (map, where gibi metodlara fonksiyon geçerken) ve Flutter'da çok sık kullanılır.

📝 Ödevler

  • [ ] Üç farklı klasik fonksiyonu (örn. çift/tek kontrolü, iki sayının toplamı, bir string'i büyük harfe çevirme) arrow function'a dönüştür.
  • [ ] Birden fazla adım gerektiren bir fonksiyonu (örn. bir sayının hem karesini hem küpünü hesaplayıp toplayan) arrow function ile yazmayı dene, neden çalışmadığını yorumla.
  • [ ] Ternary operatörünü arrow function içinde kullanarak bir yaş kategorisi belirleyen fonksiyon yaz (çocuk/genç/yetişkin gibi 3 kategori).
  • [ ] void dönüş tipli, arrow function ile yazılmış, bir mesajı biçimlendirip yazdıran bir fonksiyon yaz.

Sıradaki konu: Bölüm 5 — Konu 24: Fonksiyonlar Birinci Sınıf Vatandaş — Değişkene Atama, Parametre Olarak Geçme