Java Lambda İfadələri
Lambda İfadələri Nədir?
Lambda ifadələri (Java 8) anonim funksiyalar yaratmaq üçün qısa sintaksis təmin edir və funksional proqramlaşdırmanı dəstəkləyir.
Sintaksis
// Əsas sintaksis
(parametrlər) -> ifadə
(parametrlər) -> { ifadələr; }
// Nümunələr
Runnable r = () -> System.out.println("Salam!");
Consumer<String> c = name -> System.out.println("Salam, " + name);
BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
Funksional İnterfeyslər
Əsas İnterfeyslər
// Function<T, R> - T alır, R qaytarır
Function<String, Integer> length = s -> s.length();
// Predicate<T> - T alır, boolean qaytarır
Predicate<String> isEmpty = s -> s.isEmpty();
// Consumer<T> - T alır, heç nə qaytarmır
Consumer<String> print = System.out::println;
// Supplier<T> - heç nə almır, T qaytarır
Supplier<Double> random = Math::random;
Bi- İnterfeyslər
// BiFunction<T, U, R>
BiFunction<String, String, String> concat = (s1, s2) -> s1 + s2;
// BiPredicate<T, U>
BiPredicate<String, Integer> checkLength = (s, len) -> s.length() == len;
// BiConsumer<T, U>
BiConsumer<String, Integer> repeat = (s, n) -> {
for (int i = 0; i < n; i++) System.out.println(s);
};
Method References
Lambda ifadələrinin qısa forması:
// Lambda vs Method Reference
list.forEach(x -> System.out.println(x)); // Lambda
list.forEach(System.out::println); // Method Reference
// Növləri
String::valueOf // Static metod
obj::toString // Instance metod
String::length // Instance metod (tip üzərindən)
ArrayList::new // Constructor
Stream API ilə İstifadə
List<String> names = Arrays.asList("Ali", "Vəli", "Ayşə", "Fatma");
// Filter, map, collect
List<String> result = names.stream()
.filter(name -> name.length() > 3)
.map(String::toUpperCase)
.collect(Collectors.toList());
// Reduce
int totalLength = names.stream()
.mapToInt(String::length)
.sum();
Praktik Nümunələr
Event Handling
button.addActionListener(e -> System.out.println("Clicked!"));
Sorting
Collections.sort(list, (s1, s2) -> s1.compareToIgnoreCase(s2));
// və ya
Collections.sort(list, String::compareToIgnoreCase);
Parallel Processing
list.parallelStream()
.filter(x -> x > 0)
.mapToInt(x -> x * x)
.sum();
Üstünlükləri
- Qısalıq - Az kod, çox funksionallıq
- Oxunaqlıq - Məqsəd aydın görünür
- Funksional stil - Immutable və pure functions
- Parallel processing - Stream API ilə asanlıq
Məhdudiyyətlər
- Yalnız funksional interfeyslər üçün
- Lokal dəyişənlər effectively final olmalıdır
- Exception handling mürəkkəbdir
- Debug etmək çətindir