| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| java:functional_interfaces [2026/05/21 06:19] – gthanos | java:functional_interfaces [2026/05/21 08:15] (current) – [Παράδειγμα χρήσης του Functional Interface java.util.Comparator] gthanos |
|---|
| ===== Τι είναι τα Functional Interfaces ; ===== | ===== Τι είναι τα Functional Interfaces ; ===== |
| |
| Ένα Functional Interface είναι ένα interface το οποίο περιέχει ακριβώς μία abstract (αφηρημένη) μέθοδο. Μπορεί να έχει επιπλέον //default// ή //static// μεθόδους τις οποίες όμως δεν υπολογίζμε διότι έχουν ήδη κάποια υλοποίηση. | Ένα Functional Interface είναι ένα interface το οποίο περιέχει ακριβώς μία abstract (αφηρημένη) μέθοδο. Μπορεί να έχει επιπλέον //default// ή //static// μεθόδους τις οποίες όμως δεν υπολογίζουμε, διότι έχουν ήδη κάποια υλοποίηση. |
| |
| Συνήθως, φέρει την προαιρετική σήμανση (annotation) @FunctionalInterface πριν από τη δήλωση του Functional Interface. Αυτή η σήμανση ενημερώνει τον compiler να βγάλει σφάλμα αν κατά λάθος προσθέσουμε και δεύτερη αφηρημένη μέθοδο. | Συνήθως, φέρει την προαιρετική σήμανση (annotation) @FunctionalInterface πριν από τη δήλωση του Functional Interface. Αυτή η σήμανση ενημερώνει τον compiler να βγάλει σφάλμα αν κατά λάθος προσθέσουμε και δεύτερη αφηρημένη μέθοδο. |
| Γνωστό παράδειγμα, functional interface είναι το [[https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html|java.util.Comparator]] που λειτουργεί ως συγκριτής και επιτρέπει τη σύγκριση δύο αντικειμένων μεταξύ τους. | Γνωστό παράδειγμα, functional interface είναι το [[https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html|java.util.Comparator]] που λειτουργεί ως συγκριτής και επιτρέπει τη σύγκριση δύο αντικειμένων μεταξύ τους. |
| |
| ==== Χρήση του Functional Interface java.util.Comparator ==== | ==== Παράδειγμα χρήσης του Functional Interface java.util.Comparator ==== |
| |
| Ας υποθέσουμε ότι διαθέτουμε την κλάση [[java:jfc_interfaces|Student]] (κατεβάστε τον κώδικα) που περιέχει δύο //private// πεδία τα όνομα και το επίθετο του φοιτητή και έχουμε μία λίστα φοιτητών που θέλουμε να την ταξινομήσουμε με τη βοήθεια της μεθόδου [[https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#sort-java.util.List-java.util.Comparator-|sort]] της κλάσης [[https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html|java.util.Collections]]. | Ας υποθέσουμε ότι διαθέτουμε την κλάση [[java:jfc_interfaces|Student]] (κατεβάστε τον κώδικα) που περιέχει δύο //private// πεδία τα όνομα και το επίθετο του φοιτητή και έχουμε μία λίστα φοιτητών που θέλουμε να την ταξινομήσουμε με τη βοήθεια της μεθόδου [[https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#sort-java.util.List-java.util.Comparator-|sort]] της κλάσης [[https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html|java.util.Collections]]. |
| </code> | </code> |
| |
| H έκφραση ''(a,b) -> a.getLastName().compareTo(b.getLastName())'' είναι ένα //lamda expression//. Μπορείτε να το δείτε ως μία ανώνυμη συνάρτηση, που αποτελεί την υλοποίηση της μοναδικής //abstract// μεθόδου του αντίστοιχου Functional Interface. Ο λόγος που επιλέγεται η νέα σύνταξη είναι η αποφυγή κατασκευής επιπλέον κλάσεων, ενώ ο κώδικας γίνεται πιο περιγραφικός, διότι η λογική της σύγκρισης τοποθετείται στην αντίστοιχη συνάρτηση. | H έκφραση ''(a,b) -> a.getLastName().compareTo(b.getLastName())'' είναι ένα //lamda expression//. Μπορείτε να σκέφτεσε το //lamda expression// ως μία ανώνυμη συνάρτηση, που αποτελεί την υλοποίηση της μοναδικής //abstract// μεθόδου του αντίστοιχου Functional Interface. Ο λόγος που επιλέγεται η νέα σύνταξη είναι η αποφυγή κατασκευής επιπλέον κλάσεων, ενώ ο κώδικας γίνεται πιο περιγραφικός, διότι η λογική της σύγκρισης τοποθετείται στο σημείο χρήσης της μεθόδου. |
| |
| Περισσότερα για τα //lamda expressions// θα δούμε στη συνέχεια. | Περισσότερα για τα //lamda expressions// θα δούμε στη συνέχεια. |