User Tools

Site Tools


java:functional_interfaces

This is an old revision of the document!


Functional Interfaces

Τα Functional Interfaces είναι ένα από τα νεότερα χαρακτηριστικά που προστέθηκαν στη Java από την έκδοση 8 και μετά. Αποτελούν απαραίτητα στοιχεία για την γραφή προγραμμάτων με μία μην αντικειμενοστραφή (συναρτησιακή λογική) την οποία θα δούμε στη συνέχεια.

Τι είναι ένα Functional Interface;

Ένα Functional Interface είναι ένα interface το οποίο περιέχει ακριβώς μία abstract (αφηρημένη) μέθοδο. Μπορεί να έχει επιπλέον default ή static μεθόδους τις οποίες όμως δεν υπολογίζμε διότι έχουν ήδη κάποια υλοποίηση.

Συνήθως, φέρει την προαιρετική σήμανση (annotation) @FunctionalInterface πριν από τη δήλωση του Functional Interface. Αυτή η σήμανση ενημερώνει τον compiler να βγάλει σφάλμα αν κατά λάθος προσθέσουμε και δεύτερη αφηρημένη μέθοδο.

Γνωστό παράδειγμα, functional interface είναι το java.util.Comparator που λειτουργεί ως συγκριτής και επιτρέπει τη σύγκριση δύο αντικειμένων μεταξύ τους.

Χρήση του Interface java.util.Comparator

Ας υποθέσουμε ότι έχουμε την κλάση Student (κατεβάστε τον κώδικα) που περιέχει δύο private πεδία τα όνομα και το επίθετο του φοιτητή. Ας υποθέσουμε ότι έχουμε μία λίστα φοιτητών και θέλουμε να τους ταξινομήσουμε με τη βοήθεια της μεθόδου sort της κλάσης java.util.Collections.

Ταξιονομούμε τους φοιτητές με βάση το επίθετο τους, με τη βοήθεια του παρακάτω συγκριτή:

StudentComparator.java
public class StudentComparator<Student> implements java.util.Compator<Student> {
  int compare(Student a, Student b) {
     return a.getLastName().compareTo(b.getLastName());
  }
}
SortStudents.java
import java.util.Comparator;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
 
public class StudentSorter {
    public static void main(String[] args) {
        List<Student> list = Arrays.asList(
                                 new Student("Minnie", "Mouse"),
                                 new Student("Mickey", "Gouse"),
                                 new Student("Marry",  "Poppins"),
                                 new Student("Peter",  "Pan")
                                 );
         System.out.println(list);
         Collections.sort(list, new StudentComparator()) );
         System.out.println(list);
    }
}

Παρατηρήστε ότι για να ταξινομήσουμε τα αντικείμενα πρέπει να φτιάξουμε ένα αντικείμενο της κλάσης StudentComparator. Θα μπορούσαμε να αποφύγουμε τη σύνταξη του κώδικα της κλάσης StudentComparator και του αντικειμένου αυτής με χρήση ενός lamda expression ως εξής:

SortStudents.java
import java.util.Comparator;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
 
public class StudentSorter {
    public static void main(String[] args) {
        List<Student> list = Arrays.asList(
                                 new Student("Minnie", "Mouse"),
                                 new Student("Mickey", "Gouse"),
                                 new Student("Marry",  "Poppins"),
                                 new Student("Peter",  "Pan")
                                 );
         System.out.println(list);
         Collections.sort(list, (a,b) -> a.getLastName().compareTo(b.getLastName()) );
         System.out.println(list);
    }
}

H έκφραση (a,b) → a.getLastName().compareTo(b.getLastName()) αποτελεί ένα lamda expression που μπορείτε να το δείτε ως μία ανώνυμη συνάρτηση, που είναι η υλοποίηση της abstract μεθόδου του αντίστοιχου Functional Interface. Περισσότερα για τα lamda expressions θα δούμε στη συνέχεια.

java/functional_interfaces.1779309163.txt.gz · Last modified: 2026/05/20 20:32 by gthanos