Τι είναι οι εκφράσεις 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για μπλοκ κώδικα)