Sobes.tech
Middle

Μιλήστε για την έννοια της κλάσης CompletableFuture.

sobes.tech AI

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

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

Βασικές δυνατότητες:

  • Ασύγχρονη εκτέλεση: Επιτρέπει την εκκίνηση εργασιών σε ξεχωριστό νήμα (ή ομάδα νημάτων).
  • Σύνθεση: Μπορείτε να συνδυάσετε πολλά CompletableFuture, δημιουργώντας αλυσίδες εξαρτώμενων ενεργειών.
  • Διαχείριση εξαιρέσεων: Παρέχει μεθόδους για την επεξεργασία σφαλμάτων ασύγχρονων υπολογισμών.
  • Μη μπλοκαριστικές λειτουργίες: Το αποτέλεσμα ή η εξαίρεση επεξεργάζεται όταν το future ολοκληρώνεται, χωρίς ρητό get() ή join().

Βασικές μέθοδοι:

  • Δημιουργία:
    • supplyAsync(Supplier<T> supplier): Ξεκινά τον Supplier ασύγχρονα και επιστρέφει ένα CompletableFuture με το αποτέλεσμα του.
    • runAsync(Runnable runnable): Ξεκινά τον Runnable ασύγχρονα και επιστρέφει ένα CompletableFuture<Void>.
    • completedFuture(T value): Δημιουργεί ένα ήδη ολοκληρωμένο CompletableFuture με την καθορισμένη τιμή.
  • Μετασχηματισμός:
    • thenApply(Function<T, U> fn): Εφαρμόζει μια λειτουργία στο αποτέλεσμα όταν το future ολοκληρώνεται.
    • thenAccept(Consumer<T> action): Εκτελεί μια ενέργεια πάνω στο αποτέλεσμα όταν το future ολοκληρώνεται.
    • thenRun(Runnable action): Εκτελεί μια ενέργεια όταν το future ολοκληρώνεται, αγνοώντας το αποτέλεσμα.
    • thenCompose(Function<T, CompletionStage<U>> fn): Επιτρέπει την κατασκευή αλυσίδων, όπου το αποτέλεσμα ενός future χρησιμοποιείται για τη δημιουργία ενός άλλου.
  • Συνδυασμός:
    • thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): Συνδυάζει τα αποτελέσματα δύο futures.
    • allOf(CompletableFuture<?>... cfs): Επιστρέφει ένα CompletableFuture<Void> που ολοκληρώνεται όταν όλα τα δοθέντα futures ολοκληρωθούν.
    • anyOf(CompletableFuture<?>... cfs): Επιστρέφει ένα CompletableFuture<Object> που ολοκληρώνεται όταν οποιοδήποτε από τα δοθέντα futures ολοκληρωθεί.
  • Επεξεργασία εξαιρέσεων:
    • exceptionally(Function<Throwable, T> fn): Διαχειρίζεται την εξαίρεση επιστρέφοντας εναλλακτική τιμή.
    • handle(BiFunction<T, Throwable, U> fn): Διαχειρίζεται τόσο το αποτέλεσμα όσο και την εξαίρεση.

Παράδειγμα:

// Εκκίνηση ασύγχρονης εργασίας
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(1000); // Προσομοίωση μακράς εργασίας
    } catch (InterruptedException e) {
        throw new IllegalStateException(e);
    }
    return "Αποτέλεσμα ασύγχρονου χειρισμού";
});

// Εκτέλεση ενέργειας μετά την ολοκλήρωση της εργασίας (μη μπλοκαριστικά)
future.thenAccept(result -> {
    System.out.println("Λήφθηκε αποτέλεσμα: " + result);
});

// Μια άλλη ενέργεια που εξαρτάται από την πρώτη
future.thenApply(String::toUpperCase)
      .thenAccept(upperCaseResult -> {
          System.out.println("Αποτέλεσμα σε κεφαλαία: " + upperCaseResult);
      });

// Αναμονή όλων των εργασιών (σε πραγματικές εφαρμογές συνήθως αποφεύγουν το εμφανές get/join)
// future.join();

Το CompletableFuture είναι ένα ισχυρό εργαλείο για τη συγγραφή αντιδραστικού και μη μπλοκαριστικού κώδικα στη Java, απλοποιώντας σημαντικά τη δουλειά με την ασύγχρονη εκτέλεση σε σύγκριση με το κλασικό interface Future.