Optional Dönüşümleri: map ve flatMap
Değerleri null kontrolleri olmadan işlemek için map ve flatMap ile dönüşümleri zincirleyin.
Optional Dönüşümleri: map ve flatMap, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Optional'ları Dönüştürme: map ve flatMap
map(), mevcutsa Optional içindeki değeri dönüştürür. flatMap(), dönüşümün kendisi bir Optional döndürdüğünde iç içe Optional oluşmasını önler.
map: Değeri Dönüştürme
map(Function), mevcutsa işlevi değere uygular ve sonucu yeni bir Optional içinde sarar. Başlangıçta boşsa boş döndürür.
import java.util.Optional;
Optional<String> name = Optional.of("alice");
Optional<String> upper = name.map(String::toUpperCase);
System.out.println(upper.get()); // ALICE
Optional<Integer> length = name.map(String::length);
System.out.println(length.get()); // 5
// Empty in → empty out
Optional<String> empty = Optional.<String>empty().map(String::toUpperCase);
System.out.println(empty.isPresent()); // falsemap Çağrılarını Zincirleme
Birden çok map çağrısı, iç içe boş değer denetimleri olmadan dönüşümleri temiz bir şekilde zincirler.
import java.util.Optional;
record Address(String city, String country) {}
record User(String name, Address address) {}
User user = new User("Alice", new Address("New York", "US"));
// Chain of maps — safe even if any step returns null
Optional<String> city = Optional.ofNullable(user)
.map(User::address)
.map(Address::city)
.map(String::toUpperCase);
System.out.println(city.orElse("Unknown")); // NEW YORKflatMap: Optional<Optional> Kullanımından Kaçınma
Eşleme işleviniz Optional döndürüyorsa, iç içe Optional<Optional> yerine düz bir Optional elde etmek için flatMap kullanın.
import java.util.Optional;
record User(String name, Optional<String> email) {}
User u = new User("Bob", Optional.of("bob@example.com"));
// map returns Optional<Optional<String>> — ugly!
Optional<Optional<String>> nested = Optional.of(u).map(User::email);
// flatMap flattens: Optional<String>
Optional<String> flat = Optional.of(u).flatMap(User::email);
System.out.println(flat.get()); // bob@example.comGerçek flatMap: Depo Zinciri
Yaygın bir örüntü: her biri Optional döndüren depo aramalarını zincirlemek.
import java.util.Optional;
record Order(long id, long userId, double total) {}
record User(long id, String name, String email) {}
static Optional<Order> findOrder(long orderId) {
return orderId == 1 ? Optional.of(new Order(1, 42, 99.99)) : Optional.empty();
}
static Optional<User> findUser(long userId) {
return userId == 42 ? Optional.of(new User(42, "Alice", "a@co.com")) : Optional.empty();
}
Optional<String> email = findOrder(1)
.flatMap(o -> findUser(o.userId()))
.map(User::email);
System.out.println(email.orElse("Not found")); // a@co.commap ve flatMap Özeti
map ile flatMap arasında seçim yapma:
- İşlev sıradan bir değer döndürdüğünde (String, tam sayı)
mapkullanın - İşlev bir Optional döndürdüğünde
flatMapkullanın
import java.util.Optional;
// map: T → R
Optional.of("hello").map(String::toUpperCase); // Optional<String>
Optional.of("42").map(Integer::parseInt); // Optional<Integer>
// flatMap: T → Optional<R>
Optional.of("42").flatMap(s -> {
try { return Optional.of(Integer.parseInt(s)); }
catch (NumberFormatException e) { return Optional.empty(); }
}); // Optional<Integer> (not Optional<Optional<Integer>>)flatMap ile Güvenli Ayrıştırma
İyi bir örüntü: başarısız olabilecek riskli işlemleri flatMap kullanarak Optional içinde sarmalamak.
import java.util.Optional;
static Optional<Integer> tryParseInt(String s) {
try { return Optional.of(Integer.parseInt(s)); }
catch (NumberFormatException e) { return Optional.empty(); }
}
Optional<String> input = Optional.of("123");
Optional<Integer> parsed = input.flatMap(JavaOptional::tryParseInt);
System.out.println(parsed.map(n -> n * 2).orElse(-1)); // 246
Optional<String> bad = Optional.of("abc");
Optional<Integer> failed = bad.flatMap(JavaOptional::tryParseInt);
System.out.println(failed.orElse(-1)); // -1Optional'ları Toplama
Yalnızca mevcut değerleri toplamak için bir Optional akışını filtreleyin ve map uygulayın.
import java.util.*;
import java.util.stream.*;
List<String> inputs = List.of("10", "abc", "25", "nope", "7");
List<Integer> numbers = inputs.stream()
.flatMap(s -> {
try { return Stream.of(Integer.parseInt(s)); }
catch (NumberFormatException e) { return Stream.empty(); }
})
.collect(Collectors.toList());
System.out.println(numbers); // [10, 25, 7]İç İçe Nesnelerde Gezinme
map ve flatMap, yorucu boş değer denetimleri olmadan derin nesne grafiğinde güvenli biçimde gezinmeyi sağlar.
import java.util.Optional;
record Company(String name, Optional<Address> address) {}
record Address(String city, Optional<String> zipCode) {}
Company company = new Company(
"Acme Corp",
Optional.of(new Address("Austin", Optional.of("78701")))
);
String zip = Optional.of(company)
.flatMap(Company::address)
.flatMap(Address::zipCode)
.orElse("N/A");
System.out.println(zip); // 78701Tür Dönüşümü için map
map, Optional değerlerini tür dönüştürmek için oldukça uygundur — örneğin ayrıştırma, biçimlendirme veya bir alt alanı çıkarma işlemlerinde.
import java.util.Optional;
import java.time.LocalDate;
// Parse a date from String safely
static Optional<LocalDate> parseDate(String s) {
try { return Optional.of(LocalDate.parse(s)); }
catch (Exception e) { return Optional.empty(); }
}
Optional<String> dateStr = Optional.of("2024-06-15");
Optional<Integer> year = dateStr
.flatMap(JavaOptional::parseDate)
.map(LocalDate::getYear);
System.out.println(year.orElse(-1)); // 2024Veri Akışları Oluşturma
filter, map ve flatMap'i birleştirmek, her adımda yokluğu açık boş değer denetimleri olmadan ele alan, anlamlı veri akışları oluşturur.
import java.util.Optional;
record Product(String sku, String category, boolean inStock, double price) {}
static Optional<Product> findProduct(String sku) {
if ("LAPTOP-1".equals(sku))
return Optional.of(new Product("LAPTOP-1", "Electronics", true, 999.99));
return Optional.empty();
}
Optional<String> priceTag = findProduct("LAPTOP-1")
.filter(Product::inStock)
.filter(p -> p.price() < 2000)
.map(p -> String.format("%s: $%.2f", p.sku(), p.price()));
System.out.println(priceTag.orElse("Not available")); // LAPTOP-1: $999.99Hızlı Kontrol
Bir Optional üzerinde map yerine ne zaman flatMap kullanmalısınız?
Özet: Optional'ları Dönüştürme: map ve flatMap
Temel çıkarımlar:
- map(), mevcutsa değeri dönüştürür ve sonucu Optional içinde sarar
- flatMap(), Optional döndüren işlevler içindir; iç içe Optional oluşmasını önler
- Boş değer denetimleri olmadan çok adımlı dönüşümler için birden çok map çağrısını zincirleyin
- Optional döndüren depo/hizmet çağrılarını zincirlemek için flatMap kullanın
- Boş değere karşı güvenli veri akışları oluşturmak için filter + map + flatMap'i birleştirin
- Optional'ları akış veri akışlarına katmak için flatMap Optional::stream kullanın
Sıkça Sorulan Sorular
“Optional Dönüşümleri: map ve flatMap” dersi ücretsiz mi?
Evet — “Optional Dönüşümleri: map ve flatMap” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Optional Dönüşümleri: map ve flatMap” dersinde ne öğreneceğim?
Değerleri null kontrolleri olmadan işlemek için map ve flatMap ile dönüşümleri zincirleyin. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Optional Dönüşümleri: map ve flatMap” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Optional Neden Var?
- Optional Oluşturma ve İnceleme
- Optional Dönüşümleri: map ve flatMap
- Optional için En İyi Uygulamalar