Əsas məzmuna keçin

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