Sobes.tech
Middle

Τι είναι οι εκφράσεις lambda στη Java και ποιες δυνατότητες παρέχουν;

sobes.tech AI

Απάντηση από AI

Οι εκφράσεις lambda στη Java είναι μια σύντομη σύνταξη για τη δημιουργία ανώνυμων συναρτήσεων (μεθόδων χωρίς όνομα) που μπορούν να μεταβιβαστούν ως επιχειρήματα ή να αποθηκευτούν σε μεταβλητές. Ουσιαστικά, είναι λειτουργικά interfaces που υλοποιούνται "επί τόπου".

Οι κύριες δυνατότητες που παρέχουν οι εκφράσεις lambda:

  • Απλοποίηση σύνταξης: Μειώνουν σημαντικά τον κώδικα boilerplate κατά την εργασία με λειτουργικά interfaces σε σύγκριση με ανώνυμες εσωτερικές κλάσεις.

    // Πριν από τις lambda:
    Runnable classicRunnable = new Runnable() {
        @Override
        public void run() {
            System.out.println("Κλαστικό Runnable");
        }
    };
    
    // Με lambda:
    Runnable lambdaRunnable = () -> System.out.println("Lambda Runnable");
    
  • Λειτουργικός προγραμματισμός: Επιτρέπουν τη γραφή πιο λειτουργικού κώδικα, όπου οι συναρτήσεις είναι πολίτες πρώτης τάξης και μπορούν να μεταβιβαστούν ως δεδομένα. Αυτό είναι κλειδί για τη δουλειά με το API Stream.

    // Φιλτράρισμα μιας λίστας με lambda
    List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
    List<String> filteredNames = names.stream()
                                     .filter(name -> name.startsWith("A"))
                                     .collect(Collectors.toList());
    
  • Εργασία με το API Stream: Οι εκφράσεις lambda αποτελούν τη βάση για τις περισσότερες λειτουργίες στο API Stream (filter, map, forEach, reduce κ.ά.), παρέχοντας συνοπτικότητα και παράλληλη εκτέλεση.

    // Μετατροπή και εμφάνιση στοιχείων του stream
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    numbers.stream()
           .map(n -> n * n) // lambda για mapping
           .forEach(System.out::println); // αναφορά μεθόδου (εναλλακτική στη lambda)
    
  • Βελτίωση αναγνωσιμότητας: Για απλές λειτουργίες, οι lambdas κάνουν τον κώδικα πιο ευανάγνωστο και κατανοητό, εστιάζοντας στη λειτουργία και όχι στη σύνταξη της ανώνυμης κλάσης.

  • Υλοποίηση λειτουργικών interfaces: Μπορούν να χρησιμοποιηθούν παντού όπου αναμένεται ένα στιγμιότυπο λειτουργικού interface (interface με μία μόνο αφηρημένη μέθοδο).

Σύνταξη της έκφρασης lambda: (παραμέτρους) -> { σώμα }

Παραδείγματα:

  • Χωρίς παραμέτρους, χωρίς επιστροφή: () -> System.out.println("Γειά")
  • Με ένα παράμετρο, χωρίς επιστροφή: name -> System.out.println("Γειά, " + name) (μπορούν να παραλειφθούν τα παρένθεση γύρω από ένα μόνο παράμετρο)
  • Με πολλαπλές παραμέτρους, χωρίς επιστροφή: (x, y) -> System.out.println(x + y)
  • Με παραμέτρους, με επιστροφή: (a, b) -> a + b (αν το σώμα αποτελείται από μια έκφραση, η τιμή της επιστρέφεται έμμεσα)
  • Με παραμέτρους, με μπλοκ κώδικα και επιστροφή: (a, b) -> { int sum = a + b; return sum; } (απαιτείται ρητό return για μπλοκ κώδικα)