User Tools

Site Tools


java:functional_interfaces

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:functional_interfaces [2026/05/20 20:55] – [Ορισμός ενός δικού μας Functional Interface] gthanosjava:functional_interfaces [2026/05/21 08:15] (current) – [Παράδειγμα χρήσης του Functional Interface java.util.Comparator] gthanos
Line 1: Line 1:
 ====== Functional Interfaces ====== ====== Functional Interfaces ======
  
-Τα Functional Interfaces είναι ένα από τα νεότερα χαρακτηριστικά που προστέθηκαν στη Java από την έκδοση 8 και μετά. Αποτελούν απαραίτητα στοιχεία για την γραφή προγραμμάτων με μία μην αντικειμενοστραφή (συναρτησιακή λογική) την οποία θα δούμε στη συνέχεια.+Τα Functional Interfaces είναι ένα από τα νεότερα χαρακτηριστικά που προστέθηκαν στη Java από την έκδοση 8 και μετά. Αποτελούν απαραίτητα στοιχεία για την γραφή προγραμμάτων με μία μη-αντικειμενοστραφή (συναρτησιακή λογική) σε συνδυασμό με τα //lamda expressions//, την οποία θα δούμε στη συνέχεια.
  
-===== Τι είναι ένα Functional Interface; =====+===== Τι είναι τα Functional Interfaces ; =====
  
-Ένα Functional Interface είναι ένα interface το οποίο περιέχει ακριβώς μία abstract (αφηρημένη) μέθοδο. Μπορεί να έχει επιπλέον //default// ή //static// μεθόδους τις οποίες όμως δεν υπολογίζμε διότι έχουν ήδη κάποια υλοποίηση. +Ένα Functional Interface είναι ένα interface το οποίο περιέχει ακριβώς μία abstract (αφηρημένη) μέθοδο. Μπορεί να έχει επιπλέον //default// ή //static// μεθόδους τις οποίες όμως δεν υπολογίζουμεδιότι έχουν ήδη κάποια υλοποίηση. 
  
 Συνήθως, φέρει την προαιρετική σήμανση (annotation) @FunctionalInterface πριν από τη δήλωση του Functional Interface. Αυτή η σήμανση ενημερώνει τον compiler να βγάλει σφάλμα αν κατά λάθος προσθέσουμε και δεύτερη αφηρημένη μέθοδο. Συνήθως, φέρει την προαιρετική σήμανση (annotation) @FunctionalInterface πριν από τη δήλωση του Functional Interface. Αυτή η σήμανση ενημερώνει τον compiler να βγάλει σφάλμα αν κατά λάθος προσθέσουμε και δεύτερη αφηρημένη μέθοδο.
Line 11: Line 11:
 Γνωστό παράδειγμα, 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 java StudentComparator.java> <code java StudentComparator.java>
Line 34: Line 34:
     public static void main(String[] args) {     public static void main(String[] args) {
         List<Student> list = Arrays.asList(         List<Student> list = Arrays.asList(
-                                 new Student("Minnie", "Mouse"), +                             new Student("Minnie", "Mouse"), 
-                                 new Student("Mickey", "Gouse"), +                             new Student("Mickey", "Gouse"), 
-                                 new Student("Marry",  "Poppins"), +                             new Student("Marry",  "Poppins"), 
-                                 new Student("Peter",  "Pan"+                             new Student("Peter",  "Pan"
-                                 );+                             );
          System.out.println(list);          System.out.println(list);
          Collections.sort(list, new StudentComparator()) );          Collections.sort(list, new StudentComparator()) );
Line 46: Line 46:
 </code> </code>
  
-Παρατηρήστε ότι για να ταξινομήσουμε τα αντικείμενα πρέπει να φτιάξουμε ένα αντικείμενο της κλάσης StudentComparator. Θα μπορούσαμε να αποφύγουμε τη σύνταξη του κώδικα της κλάσης StudentComparator και του αντικειμένου αυτής με χρήση ενός //lamda expression// ως εξής:+Παρατηρήστε ότι για να ταξινομήσουμε τα αντικείμενα πρέπει να κατασκευάσουμε την κλάση //StudentComparator// και στη συνέχεια να φτιάξουμε ένα αντικείμενο της κλάσης αυτής. Θα μπορούσαμε να αποφύγουμε τη σύνταξη του κώδικα της κλάσης StudentComparator και τη δημιουργία του αντικειμένου με χρήση ενός //lamda expression// ως εξής:
  
 <code java SortStudents.java> <code java SortStudents.java>
Line 69: Line 69:
 </code> </code>
  
-H έκφραση ''(a,b) -> a.getLastName().compareTo(b.getLastName())'' αποτελεί ένα //lamda expression// και μπορείτε να το δείτε ως μία ανώνυμη συνάρτηση, που αποτελεί την υλοποίηση της μοναδικής //abstract// μεθόδου του αντίστοιχου Functional Interface. Περισσότερα για τα //lamda expressions// θα δούμε στη συνέχεια.+H έκφραση ''(a,b) -> a.getLastName().compareTo(b.getLastName())'' είναι ένα //lamda expression//. Μπορείτε να σκέφτεσε το //lamda expression// ως μία ανώνυμη συνάρτηση, που αποτελεί την υλοποίηση της μοναδικής //abstract// μεθόδου του αντίστοιχου Functional Interface. Ο λόγος που επιλέγεται η νέα σύνταξη είναι η αποφυγή κατασκευής επιπλέον κλάσεων, ενώ ο κώδικας γίνεται πιο περιγραφικός, διότι η λογική της σύγκρισης τοποθετείται στο σημείο χρήσης της μεθόδου.
  
-==== Ορισμός ενός δικού μας Functional Interface ====+Περισσότερα για τα //lamda expressions// θα δούμε στη συνέχεια. 
 + 
 +==== Παράδειγμα ορισμού ενός δικού μας Functional Interface ====
  
 Ας υποθέσουμε ότι έχουμε το interface CustomHasher<T>, το οποίο παρέχει την υλοποίση ενός hash function για κάθε διαφορετικό τύπο δεδομένων T, όπως αυτό περιγράφεται παρακάτω: Ας υποθέσουμε ότι έχουμε το interface CustomHasher<T>, το οποίο παρέχει την υλοποίση ενός hash function για κάθε διαφορετικό τύπο δεδομένων T, όπως αυτό περιγράφεται παρακάτω:
Line 82: Line 84:
 </code> </code>
  
-Ας υποθέσουμε τώρα ότι για την κλάση του φοιτητή υλοποιούμε τον παρακάτω CustomHasher+Ας υποθέσουμε τώρα ότι για την παραπάνω κλάση [[java:jfc_interfaces|Student]] του φοιτητή υλοποιούμε τον παρακάτω CustomHasher
 <code java StudentHasher.java> <code java StudentHasher.java>
 public class StudentHasher implements CustomHasher<Student> { public class StudentHasher implements CustomHasher<Student> {
     public long hash(Student s) {     public long hash(Student s) {
-        unsigned long value = 5381;+        long value = 5381;
            
         for (char c : s.getLastName().toCharArray()) {         for (char c : s.getLastName().toCharArray()) {
             value = ((value << 5) + value) + (int)c;             value = ((value << 5) + value) + (int)c;
         }         }
-        value << 1; 
         for (char c : s.getFirstName().toCharArray()) {         for (char c : s.getFirstName().toCharArray()) {
             value = ((value << 5) + value) + (int)c;             value = ((value << 5) + value) + (int)c;
Line 100: Line 102:
 </code> </code>
  
-O κώδικας για να γίνει hash ένας φοιτητής δίνεται παρακάτω+O κώδικας για να μετασχηματιστεί σε hash value ένας φοιτητής δίνεται παρακάτω
 <code java HashStudent.java> <code java HashStudent.java>
 public class StudentHasher { public class StudentHasher {
     public static void main(String[] args) {     public static void main(String[] args) {
-        Student st = new Student("giorgos", "Thanos");+        Student mickey = new Student("Mickey", "Mouse");
         StudentHasher sh = new StudentHasher();         StudentHasher sh = new StudentHasher();
-        System.out.println("Hash is: "+sh.hash(st));+        System.out.println("Hash is: "+sh.hash(mickey));
     }     }
 } }
 </code> </code>
  
-Οι δύο παραπάνω κλάσει με τη βοήθεια //lamda expression// θα μπορούσαν να γραφούν ως εξής:+Ο παραπάνω κώδικας θα μπορούσε να γραφεί ως εξής, με τη βοήθεια ενος //lamda expression// :
  
 <code java HashStudent.java> { <code java HashStudent.java> {
-    public static void main(String[] args) { +    public class HashStudent { 
-        Student st = new Student("giorgos", "Thanos"); +        public static void main(String[] args) { 
-         +            Student mickey = new Student("Mickey", "Mouse"); 
-        System.out.println("Hash is: "+ (Student s) -> { +            CustomHasher<Student> hs = (s) -> { 
-            unsigned long value = 5381; +                long value = 5381; 
-      + 
-            for (char c : s.getLastName().toCharArray()) { +                for (char c : s.getLastName().toCharArray()) { 
-                value = ((value << 5) + value) + (int)c; +                    value = ((value << 3) + value) + (int)c; 
-            +                
-            value << 1; +                for (char c : s.getFirstName().toCharArray()) { 
-            for (char c : s.getFirstName().toCharArray()) { +                    value = ((value << 3) + value) + (int)c; 
-                value = ((value << 5) + value) + (int)c; +                
-            +                return value; 
-            return value; +            }
-        });+            System.out.println("Hash is: "+ hs.hash(mickey) ); 
 +        }
     }     }
 } }
java/functional_interfaces.1779310516.txt.gz · Last modified: 2026/05/20 20:55 by gthanos